繁体   English   中英

Django通过外键分组

[英]Django group up by foreign keys

所以我有两个模型:

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

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM