我在 SQL 中有 2 個表:
class Zoo(db.Model):
id = db.Column(db.Integer, primary_key=True)
nome = db.Column(db.String(80), unique=True, nullable=False)
idade = db.Column(db.Integer, unique=False, nullable=False)
peso = db.Column(db.Float, unique=False, nullable=False)
cuidador = db.Column(db.Integer, db.ForeignKey('cuidador.id'))
class Cuidador(db.Model):
id = db.Column(db.Integer, primary_key=True)
nome = db.Column(db.String(80), unique=True, nullable=False)
animais = db.relationship('Zoo', backref='zoo', lazy=True)
并且模式定義:
class WorkerSchema(ma.SQLAlchemySchema):
class Meta:
model = Cuidador
id = ma.auto_field()
nome = ma.auto_field()
class ZooSchema(ma.SQLAlchemySchema):
class Meta:
model = Zoo
id = ma.auto_field()
nome = ma.auto_field()
idade = ma.auto_field()
peso = ma.auto_field()
cuidador = ma.Nested(WorkerSchema)
在可視化路線中,我定義了以下函式來可視化 Zoo 表中存在的資料:
def see_all_animals(self):
result_join = db.session.query(Zoo,Cuidador).join(Zoo).all()
zoo_schema = ZooSchema()
result = zoo_schema.dump(result_join,many=True)
return result
不幸的是,該函式回傳完全空的資料。我希望在這些方面出現一些東西:
{
...."id": 3,
...."idade": 5,
...."nome": "Cabra",
...."peso": 12.0,
...."cuidador": {"id":1,"nome":"Juan"}
}
uj5u.com熱心網友回復:
您的示例中使用的資料庫關系的反向參考zoo為該型別的物件添加了一個屬性,在該屬性下可以查詢被Zoo參考的物件。
對于目前使用的資料庫建模,我推薦以下棉花糖模式。這涉及將資料庫關系定義的反向參考從“zoo”重命名為“cuidador”。Cuidador
class WorkerSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = Cuidador
class ZooSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = Zoo
cuidador = ma.Nested(WorkerSchema, attribute='zoo')
沒有必要主動使用連接陳述句來實作所需的輸出。由于定義的關系和嵌套模式,參考資料的查詢和格式化會自動進行。
def index():
zoos = Zoo.query.all()
zoos_schema = ZooSchema(many=True)
zoos_data = zoos_schema.dump(zoos)
return jsonify(data=zoos_data)
此處獲得的輸出現在如下所示。
{
"data": [
{
"cuidador": {
"id": 1,
"nome": "Juan"
},
"id": 1,
"idade": 5,
"nome": "Cabra",
"peso": 12.0
}
]
}
建議大家在建模的時候多注意命名,避免不必要的重命名,加深對資料庫關系的認識。關系的正確表示和命名中避免重復將幫助您進行更多和更大的專案,我希望您在其中獲得很多樂趣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/483445.html
