назначение python свойству AppenderBaseQuery в Flask-SQLAlchemy без эффекта

У меня есть запрос на выбор списка пользователей из базы данных. Каждый пользовательский объект имеет список тегов. Это устанавливается в модели тегов с использованием этого отношения:

users = db.relationship('User', secondary=user_tag, backref=db.backref('tags', lazy='dynamic'), lazy='dynamic')

Когда результат запроса возвращается, у меня есть пользовательский объект:

идентификатор {целое} 1

теги {AppenderBaseQuery} (Выберите ...)

Все хорошо, но я хочу назначить новый список свойству tags

user.tags=list()

но эта строка не оказывает никакого влияния на объект, и пользователь по-прежнему содержит AppenderBaseQuery. Как это свойство стало неизменным. Я не понимаю. Все еще новичок в python, извините, если вопрос глупый.

РЕДАКТИРОВАТЬ:

Я не буду менять базу данных. Я безуспешно пытался отсоединить пользовательский объект от сеанса. У меня уже есть список тегов, и я просто хочу установить его в список тегов пользовательского объекта. После того, как я просто сериализую его в json и верну ответ со списком пользователей. Обычно я создаю для тегов URL-адрес с url_for, но на этот раз я хочу вернуть списки тегов с пользователем, чтобы ускорить работу.


person makkasi    schedule 08.08.2017    source источник


Ответы (1)


Он не неизменен, но немного особенный. Вы настроили свою связь и ее обратную ссылку с помощью lazy='dynamic'. Это делает так, что вместо инструментальной коллекции у вас есть объект Query, удобный для обработки больших коллекций связанных объектов. Этот объект запроса имеет несколько дополнительных методов и функций в дополнение к основным filter(), all() и т. д. запроса, таким как append(), remove(), и поддержку присваивания, но в основном это ярлык для запроса связанных объектов. Читая документы дальше, мы находим:

Поскольку сторона чтения динамической связи всегда запрашивает базу данных, изменения в базовой коллекции не будут видны до тех пор, пока данные не будут сброшены. Однако, пока на используемом Session включена функция «автосброс», это будет происходить автоматически каждый раз, когда коллекция собирается отправить запрос.

Если вы настроили свой движок так, чтобы он отображал отправляемый им SQL, вы должны наблюдать, что происходит, когда вы делаете

user.tags = []
print user.tags.all()

Autoflush должен сработать, обновив все изначально связанные объекты, обнулив их внешние ключи (зависит от каскадов) до того, как будет выдан SELECT для выборки отношения.

person Ilja Everilä    schedule 08.08.2017
comment
Я не буду менять базу данных. Я безуспешно пытался отсоединить пользовательский объект от сеанса. У меня уже есть список тегов, и я просто хочу установить его в список тегов пользовательского объекта. После того, как я просто сериализую его в json и верну ответ со списком пользователей. Обычно я создаю для тегов URL-адрес с url_for, но на этот раз я хочу вернуть списки тегов с пользователем, чтобы ускорить работу. - person makkasi; 09.08.2017
comment
В этом случае я бы рекомендовал установить теги во время сериализации. Как вы заметили, атрибут запроса appender предназначен для обработки отношений, то есть данных, расположенных в БД. Если я вас правильно понял, у вас есть отдельный набор тегов, принадлежащих пользователям, поэтому, на мой взгляд, лучше всего объединить их во время сериализации, а не пытаться сначала установить их для пользовательских объектов. Но это всего лишь мнение. - person Ilja Everilä; 09.08.2017
comment
Также вы должны включить это в свой вопрос. Сейчас это немного XY-проблема: вы спрашиваете о что-то еще, вместо того, чтобы спрашивать о том, что вы действительно пытаетесь сделать, в этом случае добавьте дополнительные данные к сериализации объектов БД. - person Ilja Everilä; 09.08.2017
comment
Да. Спасибо за ваш ответ. Я собираюсь использовать этот подход. Я принял твой ответ. Что было действительно полезно, так это ваш комментарий. С Уважением - person makkasi; 09.08.2017