Метод sqlalchemy.orm «проверяет» прерывает поведение запроса после удаления - PullRequest
0 голосов
/ 01 октября 2019

Вот как выглядит ошибка с проверкой 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()
...