Django通过外键分组

时间:2018-06-25 14:13:27

标签: python django

所以我有两个模型:

class Product(models.Model):
    name = models.CharField(_('Name'), max_length=200)

class Like(models.Model):
    product = models.ForeignKey(Product, related_name='likes', on_delete=models.DO_NOTHING)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name='likes',  on_delete=models.DO_NOTHING)

我想要获得base产品(<5个赞),standard产品(<10个赞)和premium产品的总数。

我不知道如何计算每个产品的FK,然后将它们分组。最好是1个查询。

python 3.6,django 2.1,posgtresql

1 个答案:

答案 0 :(得分:1)

我不知道在单个查询中应该如何完成该操作,但是您可以尝试以下操作:

from django.db.models import Count
qs = Product.objects.annotate(num_likes=Count('like'))

base_products = qs.filter(num_likes__lt=5)
standard_products = qs.filter(num_likes__gte=5, num_likes__lt=10)
premium_products = qs.filter(num_likes__gte=10)

此代码为您提供了3个QuerySet对象以及所需的数据。


如果您要进行单个数据库查询(查询中仍然包括两个表),但又不介意将数据加载到python列表中而不是查询集中(需要更多的内存,甚至更多的时间),那么可以尝试:

from django.db.models import Count
qs = Product.objects.annotate(num_likes=Count('like'))

base_products = []
standard_products = []
premium_products = []
for p in qs:
    if p.num_likes < 5:
        base_products.append(p)
    elif p.num_likes < 5:
        standard_products.append(p)
    else:
        premium_products.append(p)