【问题标题】:how to merge two different annotate in django?如何在 django 中合并两个不同的注释?
【发布时间】:2018-02-12 19:55:28
【问题描述】:

我有两个这样的模型:

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},...]

【问题讨论】:

    标签: django annotations django-queryset


    【解决方案1】:

    您可以将distinct 参数添加到您的Count()

    used_gift = Count('item__title', filter=Q(user__isnull=False), distinct=True)
    

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

    【讨论】:

    • 它不起作用,它为所有 used_gift 值返回 1。
    • 我发现django 2版本增加了过滤功能,而我的项目是django 1.11,这个版本不存在过滤器。
    • 不确定这样的方法是否可行,但值得尝试:Order.objects.filter(gift_code__isnull=False, gift_code__gt='').values('item__title').annotate(the_count=Count('item__title')).filter(user__isnull=False).annotate(the_count=Count('item__title', distinct=True)) 但我不能 100% 确定如何评估此查询
    • 它不起作用,它评估过滤器然后注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多