Вот как выглядит ошибка с проверкой sqlalchmy.orm, но, может быть, я просто что-то упускаю.
У меня есть таблица users
со столбцом team_id
, который является внешним ключом таблицыteams
. В моем классе User
я использую декоратор @validates
для нескольких атрибутов, включая team_id
.
class User(Base, UserMixin, db.Model):
__tablename__ = 'users'
@validates('team_id')
def validate_team_id(self, key, value):
assert Team.query.get(value), "invalid 'team_id'"
return value
Конечно, есть стол команд и класс команды. Пока все хорошо.
Я могу удалить команду:
foo = Team.query.filter(teamname='foo').first()
db.session.delete(foo)
Но когда я пытаюсь выполнить ИЛИ для запроса чего-либо, связанного с командой:
bar = Team.query.filter(teamname='bar').first()
Этовозникает исключение: TypeError: object of type 'NoneType' has no len()
См. частичную обратную трассировку ниже.
Я поместил import pdb; pdb.set_trace()
внутри validate_team_id
, поэтому я знаю, что он вызывается только во втором запросе и что value
действительно являетсяNoneType, но почему он вызывается вообще? Закомментирование validate_team_id
устраняет это поведение.
Частичное отслеживание:
~/miniconda3/envs/my_env/lib/python3.7/site-packages/sqlalchemy/orm/util.py in set_(state, value, oldvalue, initiator)
134 def set_(state, value, oldvalue, initiator):
135 if include_backrefs or not detect_is_backref(state, initiator):
--> 136 return validator(state.obj(), key, value)
137 else:
138 return value
/home/jeremy/code/my_project/my_app/models.py in validate_team_id(self, key, value)
411 @validates('team_id')
412 def validate_team_id(self, key, value):
--> 413 assert Team.query.get(value), "invalid 'team_id'"
414 return value
415
~/miniconda3/envs/my_env/lib/python3.7/site-packages/sqlalchemy/orm/query.py in get(self, ident)
921 """
922 return self._get_impl(
--> 923 ident, loading.load_on_pk_identity)
924
925 def _identity_lookup(self, mapper, primary_key_identity,
~/miniconda3/envs/my_env/lib/python3.7/site-packages/sqlalchemy/orm/query.py in _get_impl(self, primary_key_identity, db_load_fn, identity_token)
982 mapper = self._only_full_mapper_zero("get")
983
--> 984 if len(primary_key_identity) != len(mapper.primary_key):
985 raise sa_exc.InvalidRequestError(
986 "Incorrect number of values in identifier to formulate "
TypeError: object of type 'NoneType' has no len()