python 基于另一个模型中字段的Peewee约束整数

j5fpnvbx  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(99)

我正在做一个模拟网上商店的作业,并有一些模型的用户,产品,标签和交易。

class Product(peewee.Model):
    description = peewee.CharField()
    price_in_cents = peewee.IntegerField()
    stock = peewee.IntegerField()
    tags = peewee.ManyToManyField(Tag)

    class Meta:
        database = db

class Transaction(peewee.Model):
    seller = peewee.ForeignKeyField(User)
    buyer = peewee.ForeignKeyField(User)
    product = peewee.ForeignKeyField(Product)
    amount =peewee.IntegerField()

我已经通读了de文档,但无法找到如何在交易中设置金额约束,使其不能大于对应于产品类的股票价值,以及如果可能的话,如何告诉它卖方和买方不能相同。

x3naxklr

x3naxklr1#

数据库对提供CHECK类型约束(涉及到遍历连接)的支持有不同的级别和类型。我认为您需要的可能是某种形式的CHECK约束,但如何准确地实现这一点将取决于您的数据库。或者,您可以使用pre-INSERT触发器,该触发器执行查找并在值无效时引发错误。但您可能还需要在product表上使用一个相应的post-UPDATE钩子,以便在它违反相关事务的约束时也引发错误。
Peewee CHECK约束文档:

  • http://docs.peewee-orm.com/en/latest/peewee/models.html#single-column-indexes-and-constraints
  • http://docs.peewee-orm.com/en/latest/peewee/api.html#Field
  • http://docs.peewee-orm.com/en/latest/peewee/api.html#Check

基本单表检查示例:

class Transaction(Model):
    amount = DecimalField(decimal_places=2, constraints=[Check('amount > 0')])

对于第二部分,您可以执行以下操作:

seller = peewee.ForeignKeyField(User, constraints=[Check('seller_id != buyer_id')])
buyer = peewee.ForeignKeyField(User)

相关问题