【问题标题】:Flask-Marshmallow issue with Nested嵌套的烧瓶棉花糖问题
【发布时间】:2019-12-10 15:09:56
【问题描述】:

我尝试使用 flask-marshmallow 将数据从一对多关系模型带到 JSON,但我不知道如何使用 Nested 在详细信息中显示来自 db.relationships 的所有数据。现在它只列出数字。现在看起来如何。请注意最后一项(invoice_add)。非常感谢您的解释。

不是如下所示的输出

['id': 1, 'invoice_actual_payment': [], 'invoice_date': None, 'path': None, 'invoice_add': [1, 2]}]

需要长相

'id': 1, 'invoice_actual_payment': [], 'invoice_date': None, 'path': None, 'invoice_add': [{'id': 1, 'addDescription': 'addPickUp'}, {'id': 2, 'addDescription': 'addPickUp'}]}]

我的模型是:

class Invoicecust(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    fin_id = db.Column(db.Integer)
    path = db.Column(db.Text)
    prefin_id = db.Column(db.Integer, db.ForeignKey('prefin.id'))
    req_id = db.Column(db.Integer, db.ForeignKey('request.id'))
    invoice_number = db.Column(db.Text)
    invoice_amount = db.Column(db.Float)
    invoice_vat = db.Column(db.Float)
    invoice_date = db.Column(db.DateTime)
    invoice_deadline_payment = db.Column(db.DateTime)
    invoice_tracking_number = db.Column(db.Text)
    invoice_tracking_company = db.Column(db.Text)
    invoice_tracking_day = db.Column(db.DateTime)
    invoice_actual_payment = db.relationship('Invoice_payment_c', backref='inv_c', lazy='dynamic')
    invoice_add = db.relationship('AddInvoiceCust', backref='inv_add')
    customer_id = db.Column(db.Integer, db.ForeignKey('customer.id'))

class AddInvoiceCust(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    addNumber = db.Column(db.Integer)
    addDescription = db.Column(db.Text)
    addAmount=db.Column(db.Float)
    addVat = db.Column(db.Float)
    invoicecust_id = db.Column(db.Integer, db.ForeignKey('invoicecust.id') )

我的谢玛是:

class InvoicecustShema(ma.ModelSchema):
    class Meta:
        model = Invoicecust

class AddInvoiceShema(ma.ModelSchema):
    class Meta:
        model=AddInvoiceCust
        fields = ('id', 'addDescription' , 'test' )
    test=fields.Nested(InvoicecustShema)

【问题讨论】:

    标签: flask-marshmallow


    【解决方案1】:

    您必须在会话中提供 flask-marshmallow。它使用棉花糖-sqlalchemy。该库使用会话基于 primary_keys 延迟加载关系。如果没有会话,您只会得到一个 id 列表。

    您可以查看 marshmallow-sqlalchemy docs here 了解更多信息。

    在您的示例中,您还定义了一个名为 test 的字段。

    class AddInvoiceShema(ma.ModelSchema):
        class Meta:
            model=AddInvoiceCust
            fields = ('id', 'addDescription' , 'test' )
        test=fields.Nested(InvoicecustShema)
    

    字段应该以这样的关系命名:

    class AddInvoiceShema(ma.ModelSchema):
        invoice_add = fields.Nested(InvoicecustShema, many=True)
    
        class Meta:
            model=AddInvoiceCust
            session=db.session
    

    【讨论】:

    • 我添加到我的 schmea sqla_session = db.session,但它不起作用。还是一样
    • 我已经更新了我的答案。看起来应该代表关系的字段定义可能存在问题。
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2020-09-23
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多