首页 > 解决方案 > Flask SQLAlchemy 访问多对一父属性

问题描述

我已经在 stackoverflow 中搜索了类似问题的解决方案,但还没有找到,或者可能未能正确实施解决方案。我有一个名为 ProductCardModel 的关联模型,它是通过外键建立的许多关系的一部分。我无法在此模型中加载连接的关系。我可以从父模型访问它,并通过对关系的列表理解来查看连接如何(来自我未在此处包含的另一个模型)

'product_cards': [ product_card.json() for product_card in self.product_cards.all()]

我该如何解决这个问题。我想要连接到 ProductModel 的 product_id 来获取它的属性。是我应该如何构建我的模型还是应该如何查询它?

下面是两个连接的模型

from db import db


class ProductModel(db.Model):
    __tablename__ = "products"

    product_id = db.Column(db.Integer, primary_key=True)
    product_price = db.Column(db.Float(precision=2))
    product_name = db.Column(db.String(250))
    product_barcode = db.Column(db.String(250))
    product_code = db.Column(db.String(100))
    product_category = db.Column(db.String(100))
    zone_name = db.Column(db.String, db.ForeignKey("zones.zone_name"))
    product_cards = db.relationship('ProductCardModel', backref='products', lazy='dynamic')


    def __init__(self, product_price, product_name, product_barcode,
                 product_code, product_category, zone_name):
        self.product_price = product_price
        self.product_name = product_name
        self.product_barcode = product_barcode
        self.product_code = product_code
        self.product_category = product_category
        self.zone_name = zone_name

    def json(self):
        return {
            'product_id': self.product_id,
            'product_price': self.product_price,
            'product_name': self.product_name,
            'product_barcode': self.product_barcode,
            'product_code': self.product_code,
            'product_category': self.product_category,
            'zone_name': self.zone_name,
            'product_card': [product_card.json() for product_card in self.product_cards.all()]
        }   

    @classmethod
    def find_by_product_code(cls, code):
        return cls.query.filter_by(product_code=code).all()

    @classmethod
    def find_by_product_id(cls, product_id):
        return cls.query.filter_by(product_id=product_id).first()

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    def delete_from_db(self):
        db.session.delete(self)
        db.session.commit()

问题出在下面

from flask import json
from datetime import datetime
from db import db
from models.product import ProductModel

class ProductCardModel(db.Model):
    __tablename__ = "productcards"

    product_card_id = db.Column(db.Integer, primary_key=True)
    product_order = db.Column(db.String(50))
    quantity_needed = db.Column(db.Integer)
    quantity_final = db.Column(db.Integer, default=0)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)
    date_modified = db.Column(db.DateTime, default=datetime.utcnow)
    modified_by_user = db.Column(db.Integer, db.ForeignKey("users.user_id"))
    added_by = db.Column(db.String(50))
    is_done = db.Column(db.Boolean, default=False)
    fault_by_user = db.Column(db.Integer, db.ForeignKey("users.user_id"))
    fault_text = db.Column(db.String(250))
    fault_is_true = db.Column(db.Boolean, default=False)
    shipment = db.Column(db.Integer, db.ForeignKey('shipments.shipment_id'))
    vendor = db.Column(db.String(5), db.ForeignKey('vendors.vendor_name'))
    product_id = db.Column(db.Integer, db.ForeignKey('products.product_id'),)
    product = db.relationship("ProductModel", uselist=False)
    fault = db.relationship("UserModel", foreign_keys=[fault_by_user])
    modified = db.relationship("UserModel", foreign_keys=[modified_by_user])

    def __init__(self, product_id, product_order, quantity_needed, added_by, shipment, vendor, *args, **kwargs):
        self.product_id = product_id
        self.product_order = product_order
        self.quantity_needed = quantity_needed
        self.added_by = added_by
        self.shipment = shipment
        self.vendor = vendor

    def json(self):
        return {
            'product_card_id': self.product_card_id,
            'product': self.product_id,
            'product_order': self.product_order,
            'quantity_needed': self.quantity_needed,
            'quantity_final': self.quantity_final,
            'date_created': self.date_created.isoformat(),
            'date_modified': self.date_modified.isoformat(),
            'modified_by': self.modified_by_user,
            'added_by': self.added_by,
            'is_done': self.is_done,
            'fault': self.fault,
            'failt_text': self.fault_text,
            'fault_is_true': self.fault_is_true,
            'shipment': self.shipment,
            'vendor': self.vendor
        }
    @classmethod
    def find_by_id(cls, product_card_id):
        return cls.query.filter_by(product_card_id=product_card_id).first()

    @classmethod
    def find_by_product(cls, product):
        return cls.query.filter_by(product_id=product).first()

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    def delete_from_db(self):
        db.session.delete(self)
        db.session.commit()

提前感谢您的任何反馈!
最好的问候,
雷达尔

标签: pythonflaskflask-sqlalchemyflask-restful

解决方案


推荐阅读