Django-在带有注释的特定字段上使用不同的
Django-Using distinct on a specific field with annotate
我有以下型号:
class Post(models.Model):
title = models.CharField(max_length=30)
class PostView(models.Model):
post = models.ForeignKey(Post, related_name='views', on_delete=models.CASCADE)
user = models.ForeignKey(get_user_model(), related_name='my_views')
created = models.DateTimeField(auto_now_add=True)
我想获得按唯一浏览量排序的帖子。
我通过以下代码获取按视图排序的帖子:
filters = {
'created__date__gte': datetime.datetime(year=2020, month=1, day=1),
'created__date__lte': datetime.datetime(year=2021, month=1, day=1),
}
qs = Post.objects.all().annotate(
total_views=Count('views', filter=Q(**filters))
).order_by('-total_views')
以上代码会将所有视图计算为 total_views
。我想通过 user
获得独特的观点。
可以用 ORM 做到这一点吗?
您可以直接计算 views__user
并在此聚合上应用 distinct=True
,而不是计算 views
:
qs = Post.objects.all().annotate(
total_views=Count('views__user', distinct=True, filter=Q(**filters))
).order_by('-total_views')
我有以下型号:
class Post(models.Model):
title = models.CharField(max_length=30)
class PostView(models.Model):
post = models.ForeignKey(Post, related_name='views', on_delete=models.CASCADE)
user = models.ForeignKey(get_user_model(), related_name='my_views')
created = models.DateTimeField(auto_now_add=True)
我想获得按唯一浏览量排序的帖子。 我通过以下代码获取按视图排序的帖子:
filters = {
'created__date__gte': datetime.datetime(year=2020, month=1, day=1),
'created__date__lte': datetime.datetime(year=2021, month=1, day=1),
}
qs = Post.objects.all().annotate(
total_views=Count('views', filter=Q(**filters))
).order_by('-total_views')
以上代码会将所有视图计算为 total_views
。我想通过 user
获得独特的观点。
可以用 ORM 做到这一点吗?
您可以直接计算 views__user
并在此聚合上应用 distinct=True
,而不是计算 views
:
qs = Post.objects.all().annotate(
total_views=Count('views__user', distinct=True, filter=Q(**filters))
).order_by('-total_views')