如何在django中对多个字段使用计数?
如何在Django中的多个字段上使用如何在django中对多个字段使用计数?,django,django-models,Django,Django Models,如何在Django中的多个字段上使用Count?如果给定的多个列是唯一的,如何仅计算行数? 例如,下面的模型 class ProductViewed(models.Model): user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, blank=True, null=True, related_name="viewed")
Count
?如果给定的多个列是唯一的,如何仅计算行数?
例如,下面的模型
class ProductViewed(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,
blank=True, null=True, related_name="viewed")
ip_address = models.CharField(max_length=255, blank=True, null=True)
product = models.ForeignKey(Product, on_delete=models.CASCADE,
related_name="views")
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{str(self.product)} viewed on {self.created_at}'
class Meta:
ordering = ('-created_at', )
verbose_name_plural = "ProductViewed"
我想实现以下目标。基于用户id
,ip地址
,当天创建的计数。有什么办法吗
目前我可以做到以下几点
Product.objects.annotate(vcount=Count('views__ip_address'))
你就不能这么做吗
Product.objects.annotate(vcount=Count('views__ip_address')).annotate(ucount=Count('views__user_id')).annotate(ccount=Count('views__created_at__day'))
一种方法是将要对其执行唯一计数的所有字段连接在一起,然后使用计算结果。该函数适用于提取日期时间的一部分
from django.db.models.functions import Trunc, Concat
Product.objects.annotate(
view_day=Trunc('views__created_at', 'day')
).annotate(
user_ip_and_day=Concat('views__user_id', 'views__ip_address', 'view_day', output_field=models.CharField())
).annotate(
vcount=models.Count('user_ip_and_day')
)
对关系进行计数通常意味着不存在相关对象的行将不会出现在结果中-对于查询中不返回不存在相关productview
对象的Product
s,您同意吗?您的回答几乎解决了我的问题。让我再检查一下,我会接受它作为答案。