簡體   English   中英

如何將SQLAlchemy模型對象轉換為純python對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM