SQLAlchemy не может установить несопоставленные свойства - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь использовать несопоставленные свойства в своем классе модели SQLAlchemy. Это просто то, что я делаю:

class Event(db.Model):
    ....
    is_favourite = False

Когда я пытаюсь установить значение этого несопоставленного свойства, у меня странное поведение. Вот что происходит (предположим, у меня есть список из 3 событий):

events[0].is_favourite = True
events[1].is_favourite = True
events[2].is_favourite = True
current_app.logger.info(events[0].is_favourite)
current_app.logger.info(events[1].is_favourite)
current_app.logger.info(events[2].is_favourite)

Это печатает:

True False True

Пока я Я ожидаю

True True True

Это, на мой взгляд, очень странное поведение, учитывая, что это просто свойство класса. Почему это происходит? Есть ли способ использовать несопоставленные свойства в SQLAlchemy?

Редактировать

Как Стивен указал в комментарии правильный путь для достижения этой цели используя реконструктора. Кстати, моя проблема была в самом запросе, так как я перебирал

Event.query.filter(Event.uuid.in_(events_uuids)) 

вместо

Event.query.filter(Event.uuid.in_(events_uuids)).all()

1 Ответ

1 голос
/ 04 марта 2020

Даже если вы берете SQLAlchemy из уравнения, вы обычно путаете то, что должно быть переменной экземпляра, с переменной определения класса. Вы, вероятно, также столкнетесь с проблемами безопасности потоков ..

SQLAlchemy делает некоторые интересные вещи с объектами модели. Это может указать вам правильное направление, если вы хотите узнать больше

Что вы, вероятно, хотите сделать, это:

from sqlalchemy.orm import reconstructor

class Event(db.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.init_on_load()

    @reconstructor
    def init_on_load(self):
        self.is_favourite = False
...