#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)
обращается. Он печатает всю информацию. Это имеет значение.