【问题标题】:Writing query inside a model在模型中编写查询
【发布时间】:2021-10-15 15:03:05
【问题描述】:

我想编写一个查询,如果 Complete Status 全部为 true ,则模型内部的完整 Order 应该自动为 true。我可以使用某些方法或任何方法在 Order 模型中编写查询吗?你能建议一些帮助吗?

class Order(models.Model):
    customer = models.ForeignKey(Customer , on_delete=models.SET_NULL , 
    null= True , blank = True)
    date_ordered = models.DateTimeField(auto_now_add = True)
    complete = models.BooleanField(default=False)
    transaction_id = models.CharField(max_length= 100 , null=True)



class CompleteStatus(models.Model):
    order = models.ForeignKey('Order', on_delete=models.SET_NULL , 
null=True)
    seller = models.BooleanField(default=False)
    warehouse =models.BooleanField(default=False)
    pickup = models.BooleanField(default=False)
    delivered =  models.BooleanField(default=False)
    received_by_customer =  models.BooleanField(default=False)

【问题讨论】:

  • 请问为什么CompleteStatus 是一个单独的模型,而不是Order 中的status 字段?
  • 一个Order 可以有多个CompleteStatusses 吗?如果不是,那为什么没有从CompleteStatusOrderOneToOneField
  • @Lewis 我只是想这样做,我可以看到完整状态的真假
  • @WillemVanOnsem 感谢兄弟的建议.. 我在我的纠正了

标签: python django model


【解决方案1】:

正如我所见,您需要它,以便在保存 CompleteStatus 对象时,检查所有布尔字段是否为真。如果是,则将 Order.complete 设置为 True。

在这种情况下,您可以简单地编辑save 方法:

class CompleteStatus(models.Model):
    order = models.ForeignKey('Order', on_delete=models.SET_NULL, null=True)
    seller = models.BooleanField(default=False)
    warehouse = models.BooleanField(default=False)
    pickup = models.BooleanField(default=False)
    delivered = models.BooleanField(default=False)
    received_by_customer = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if self.order and self.warehouse and self.pickup and self.delivered and self.received_by_customer:
            self.order.complete = True
            self.order.save(update_fields=['complete'])

你也可以这样做:

class Order(models.Model):
    ...

    @property
    def complete(self):
        if complete_status := self.completestatus
            return complete_status.warehouse and complete_status.pickup and complete_status.delivered and complete_status.received_by_customer

print(order.complete)
# True

但是您将无法按该值进行过滤,

【讨论】:

  • 嘿兄弟谢谢你的帮助..它工作得非常完美。再次感谢你:)
  • 没有问题!你能接受它作为答案吗?
  • 嘿兄弟,如果我想说,如果 self.ordercompletestatus.exists 像在其他地方一样,在保存方法中,我应该写什么。我想让该方法仅在 self 具有 ordercompletestatus 模型时才起作用。
猜你喜欢
  • 2017-12-28
  • 2021-02-06
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2021-08-18
相关资源
最近更新 更多