Django复杂注释:这是否可行?

4

我希望尝试做一些可能对于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
count=locations.filter(order__delivered=False).count()? - Paulo Bu
我猜我可以像这样注释这个查询?locations = count.objects.annotate(latest_order=Min('order__timestamp').order_by('latest_order')) - jasongonzales
今晚回家后我会尝试。 - jasongonzales
对你来说,count是什么?在我的注释中,它是一个int - Paulo Bu
抱歉,我读得太快了,仅有一个整数我无法处理任何操作。我需要知道该整数在模板中与位置相关联,但我认为我可以使用您的方法进行类似于这样的处理:count=locations.filter(order__delivered=False).annotate(undelivered=Count(order_delivered)) 然后 locations = count.objects.annotate(latest_order=Min('order__timestamp').order_by('latest_orde‌​r')) - jasongonzales
显示剩余2条评论
1个回答

2
最初的回答:这个能解决问题吗?
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作为该位置订单的数量添加,其中delivered==False。第二个注释是你已经发现的,它抓取了最新订单的时间戳。
免责声明:我没有测试过这个代码。如果有错误,请指出并修改 :)
在此处查看更多有用的命令: https://docs.djangoproject.com/en/dev/topics/db/aggregation/ 自Django 2.0以来,Countfilter参数存在。您可以在Django 1.11中使用SubQuery表达式完成相同的操作: https://docs.djangoproject.com/en/dev/releases/1.11/#subquery-expressions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接