Django复杂注释:这可能吗?

时间:2013-05-03 15:31:34

标签: python django aggregate-functions django-orm

我正在尝试为Django目前的ORM功能做一些可能过于复杂的事情。但是,无论如何,我们试一试。

首先,以下是我正在使用的模型:

class Location(models.Model):
  name=models.CharField(max_length=255)
  beverages = models.ManyToManyField(Beverage, through='LocationStandard')
  location_number=models.CharField(max_length=255)
  organization=models.CharField(max_length=255)

class OrderGroup(models.Model):
  id = models.AutoField(primary_key=True)

  def __unicode__(self):
      return str(self.id)

class Order(models.Model):
  group=models.ForeignKey(OrderGroup)
  location=models.ForeignKey(Location) #elim this or m2m
  beverage=models.ForeignKey(Beverage)
  units_ordered=models.IntegerField(max_length=10, default=0)
  order_delivered=models.NullBooleanField(null=True)
  timestamp=models.DateTimeField(auto_now_add=True)
  user=models.ForeignKey(User)

以下是我试图在模板中呈现的内容:

{{ location.name }}
{{ location.latest_order }}
{{ location.unfilled_orders }}

所以,我需要列出每个位置,从该位置下一个订单的时间,以及order_delivered = False的数量。

我可以成功获取最近订单时间戳的位置,如下所示:

locations = Location.objects.annotate(latest_order=Min('order__timestamp')).order_by('latest_order')

但现在我想为该订单计算order_delivered = False。我很难过。

对我有任何帮助吗?

1 个答案:

答案 0 :(得分:2)

这有用吗?

print

第一个注释将locations = Locations.objects.annotate( unfilled_orders= Count('order', filter=Q(order__delivered=False), latest_order=Min(order__timestamp), ).order_by('unfilled_orders') # If you like 添加为unfilled_orders所在位置的订单数。您已经发现的第二个,获取了最新订单的时间戳。

免责声明:我尚未对此进行测试。如果有错误,请进行编辑:)

在这里查看更多方便的咒语:

https://docs.djangoproject.com/en/dev/topics/db/aggregation/

自Django 2.0起,delivered==False的{​​{1}}参数就存在了。您可以在Django 1.11中使用SubQuery表达式完成相同的操作:

https://docs.djangoproject.com/en/dev/releases/1.11/#subquery-expressions