Flask / SQLAlchemy: результат запроса iter получает отношения, только если я предварительно напечатал запрос?

#loops #flask #sqlalchemy #relationship

#циклы #flask #sqlalchemy #связь

Вопрос:

Я не понимаю, что здесь происходит: у меня есть SQLite-таблица и SQLAlchemy на Flask.

 class mymodel(db.Model):
    __tablename__ = 'mytable'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"something('{self.id}')"

    def __iter__(self):
        values = vars(self)
        for attr in self.__mapper__.attrs.keys():
            if attr in values:
                yield attr, values[attr]

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content=db.relationship('mymodel', backref='creator', lazy=True)

    def __repr__(self):
        return f"something_else('{self.id}','{self.title}')"

    def __iter__(self):
        values = vars(self)
        for attr in self.__mapper__.attrs.keys():
            if attr in values:
                yield attr, values[attr]
 

Затем я запрашиваю mymodel:

 id=1
result=mymodel.query.filter(User.id==id).all()
for x,y in result:
    print(x,y)
 

Результат:

 id 1
title mytitle
user_id 1
 

Я ожидал бы получить объект (от пользователя) для user_id взамен вместо табличного значения «1».
НО если я повторю мой запрос с предыдущим оператором печати, результат будет таким, как ожидалось:

 id=1
result=mymodel.query.filter(User.id==id).all()
print(result)
for x,y in result:
    print(x,y)

The result is: 

id 1
title mytitle
user_id 1
content {'id':1,'title':'Username'}
 

Я не понимаю, почему оператор печати может изменять результаты, я хочу знать, почему это происходит и как я могу контролировать результаты.
Спасибо!

Ответ №1:

lazy=True заставляет ORM загружать зависимое только при доступе к нему. Цикл for не обращается к нему, но print(result) обращается. Он печатает всю информацию. Это имеет значение.