[英]How to convert SQLAlchemy model object to pure python object
我有User(db.Model)和Photo(db.Model)以及它們之間的一對多關系,因此用戶有很多照片。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
photos = db.relationship('Photo', backref='user', lazy='dynamic')
def to_json(self):
json = {
'id': self.id,
'photos': [photo.to_json() for photo in self.photos] if self.photos else None,
'name': self.name
}
return json
class Photo(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
name = db.Column(db.String(1024), nullable=False)
def to_json(self):
json = {
'id': self.id,
'user_id': self.user_id,
'name': self.name
}
return json
我的目標是通過單個查詢選擇所有用戶及其所有照片,而我使用本地查詢來做到這一點:
from sqlalchemy import text
statement = text('SELECT u.*, p.* FROM user u LEFT JOIN photo p ON u.id=p.user_id')
user_photo_query = db.session.query(User, Photo).from_statement(statement)
user_photo_tuples = user_photo_query.all()
users_dict = {}
db.session.expunge_all()
db.session.close()
for u, p in user_photo_tuples:
if not users_dict.get(u.id, None):
u.photos = list()
users_dict.update({u.id: u})
users_dict.get(u.id).photos.append(p)
users = users_dict.values()
return jsonify({'users': [user.to_json() for user in users]})
該查詢的結果中有元組列表(User_240298428,Photo_20394823)。 該列表的每條記錄中的照片都不相同。 該列表的某些記錄的用戶相同。 因為我不想再將用戶和照片對象綁定到會話,所以我這樣做:
db.session.expunge_all()
db.session.close()
因此,我遍歷該列表並嘗試將所有照片添加到相應的user.photos列表中。
users_dict.get(u.id).photos.append(p)
在這里我得到錯誤:
父實例未綁定到會話; 無法執行屬性“用戶”的延遲加載操作
這是因為用戶對象與照片對象之間的關系:
photos = db.relationship('Photo', backref='user', lazy='dynamic')
我想要的是將user.photos用作常規列表,而不是SQLAlchemy關系。 我想將照片添加到用戶列表,而無需將其以某種方式連接到sqlalchemy。 希望很清楚
有些事情使我認為您沒有正確利用sqlalchemy模型。 為什么不從會話中分離出來並處理您的關系(許多具有相同用戶的元組?)的怪異事情,卻不能通過使用SQLalchemy專用的機制來為每個用戶創建照片列表呢?
如果您在“用戶”和“照片”之間有聯系,則可以:
將關系加載策略更改為默認值(完全刪除惰性屬性或將其設置為“選擇”),然后在數據庫中查詢用戶:
users = db.session.query(User).all()
...並以db對象列表的形式訪問用戶的照片。
user.photos # photos is a list of all user's photos
使用lazy='dynamic'
可以以相同的方式訪問所有用戶,但是現在照片也成為查詢(更多信息: dynamic Relationships ):
能夠管理大型館藏的關鍵特征是所謂的“動態”關系。 這是Relationship()的一種可選形式,在訪問時返回一個Query對象代替集合。
...並且像每個查詢一樣,您可以使用其API( filter()
, first()
或您的all()
來獲取所有照片。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.