如何在django中合并两个不同的注释?

时间:2018-02-12 19:55:29

标签: django annotations django-queryset

我有两个这样的模型:

class Item(models.Model):
   title = models.CharField(max_length=128)


class Order(models.Model):
   item = models.ForeignKey(Item)
   user = models.ForeignKey('users.User',null=True)
   gift_code = models.CharField(max_length=20,default='')

我需要注释两个不同的查询:

Order.objects.filter(gift_code__isnull=False, gift_code__gt='').values('item__title').annotate(the_count=Count('item__title'))

Order.objects.filter(gift_code__isnull=False, gift_code__gt='', user__isnull=False).values('item__title').annotate(the_count=Count('item__title'))

问题是我找不到合并这两个查询的方法。

我试过这个方法,但两个值都是一样的:

all_gift = Count('item__title')
used_gift = Count('item__title', filter=Q(user__isnull=False))
gifts = Order.objects.filter(gift_code__isnull=False, gift_code__gt='').values('item__title').annotate(all_gift=all_gift).annotate(used_gift=used_gift)

实际输出:

[{'item__title': 'title', 'used_gift': 500, 'all_gift': 500},...]

我的预期输出是:

[{'item__title': 'title', 'used_gift': 60, 'all_gift': 500},...]

1 个答案:

答案 0 :(得分:0)

您可以在distinct

中添加Count()参数
used_gift = Count('item__title', filter=Q(user__isnull=False), distinct=True)

这样就可以消除其他注释造成的重复,并返回预期的60个礼物。