gpt4 book ai didi

mysql - 如何自动填充 sqlalchemy 列的值

转载 作者:行者123 更新时间:2023-11-29 16:16:34 24 4
gpt4 key购买 nike

我正在开发电子商务应用程序的数据库,我有一对多关系 - 使用 SQLAlchemy relationship() - 之间Order表(父级)和 OrderItem表( child )。

数据库:

class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
customer_id = db.Column(db.Integer, db.ForeignKey('customer.id'), nullable=False)
total = db.Column(db.Integer, nullable=False)
submitted_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
delivery_charges = db.Column(db.Integer, nullable=False)
sub_total = db.Column(db.Integer, nullable=False) # needs to be calculated automatically
total_quantity = db.Column(db.Integer, nullable=False) # needs to be calculated automatically
order_items = db.relationship('OrderItem', backref='order', lazy=True)

def __init__(self, customer_id, delivery_charges, sub_total, total_quantity):
self.customer_id = customer_id
self.delivery_charges = delivery_charges
self.sub_total = sub_total
self.total_quantity = total_quantity
self.total = delivery_charges + sub_total


class OrderItem(db.Model):
__tablename__ = "order_item"
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(db.Integer, db.ForeignKey('order.id'), nullable=False)
product_size_color_id = db.Column(db.Integer, db.ForeignKey('product_size_color.id'), nullable=False)
sale_id = db.Column(db.Integer, db.ForeignKey('sale.id'), nullable=True, default=None)
selling_price = db.Column(db.Integer, nullable=False) # needs to be calculated automatically
quantity = db.Column(db.Integer, nullable=False)

我想做的是:我希望根据其他表中的值自动计算某些列:

-Order.total_quantity :每个 order_item.quantity 的总和对应同一个Order实例

-Order.sub_total :每个 order_item.selling_price 的总和对应同一个Order实例。

-Order_item.selling_price :...

我用过default让一些列自动坐像 Order.submitted_on并使用__init__类中的函数Order计算 Order.total值如 this question 中回答,但是,这两种方法仅在值位于类/表本身内时才有效,我的问题是:如何根据其他表的值自动设置列的值?!!

我在 Order.total_quantity 列上尝试了以下代码,它用零填充了该列!

    def __init__(self, customer_id, delivery_charges, sub_total):
self.customer_id = customer_id
self.delivery_charges = delivery_charges
self.sub_total = sub_total
order_items = self.order_items
self.total_quantity = sum([i.quantity for i in order_items])
self.total = delivery_charges + sub_total

我想做的事情可能吗?怎么办?

最佳答案

问题是,当您初始化 Order 对象时,还没有关联的 order_items。您不可能创建任何订单,除非您猜测 order_id 是什么,而这似乎相当危险。与其在 init 上运行它,为什么不在添加所有项目后运行更新数量方法呢?

例如:

class Order(Model):
# your code as-is

def update_total(self):
self.total_quantity = sum([i.quantity for i in self.order_items])
self.total = self.delivery_charges + self.sub_total

该方法正是您已经提议的方法,位于 __init__ 之外,因为您需要在添加项目后调用它。事实上,我会完全删除您的 __init__ - 这样您就可以在需要时更改总计(假设您需要在创建订单后但在关闭之前将一个项目添加到订单中),并且调用 update_total() 来获取最新的所有内容。

您还可以考虑创建一种方法来添加项目,并使用它来添加项目并同时更新总计。您可以使用它来自动计算任意数量的商品类型(我假设为 ProductSizeColor)的价格。我将其称为“line_total”,但您可以使用任何对您有意义的内容。

class OrderItem(Model):
__tablename__ = 'order_item'
id = Column(Integer, primary_key=True)
order_id = Column(Integer, ForeignKey('order.id'))
product_size_color_id = Column(Integer, ForeignKey('product_size_color.id'))
product_size_color = relationship('ProductSizeColor')
# would it make more sense for the sale to be associated with the order
# instead of the order item?
sale_id = Column(Integer, ForeignKey('sale.id'))
quantity = Column(Integer)
line_total = Column(Integer)

class Order(Model):
# other code

def update_total(self):
self.total_quantity = sum([i.quantity for i in self.order_items])
self.sub_total = sum([i.line_total for i in self.order_items])
self.total = self.delivery_charges + self.sub_total

def add_item(self, session, psi_id, quantity):
s = session
order_item = OrderItem(
order_id = self.id,
product_size_color_id = psi_id,
quantity = quantity
)
s.add(order_item)
line_total = order_item.product_size_color.selling_price * quantity
order_item.line_total = line_total
self.update_total()

然后实时:

s = session()
order = Order(customer_id=customer_id, delivery_charges=delivery_charges,
sub_total=sub_total)
s.add(order)
order.add_item(s, 1, 10)
order.add_item(s, 2, 8)
s.commit()

我们刚刚添加了 10 个 ProductSizeColor 编号 1 和 8 个 ProductSizeColor 编号 2,并更新了商品总数、每个产品的总数以及整个订单的总数。

关于mysql - 如何自动填充 sqlalchemy 列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54748888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com