所以我有两个模型:
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
答案 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)