【问题标题】:Django-Using distinct on a specific field with annotateDjango-在带有注释的特定字段上使用不同
【发布时间】:2021-07-31 17:56:36
【问题描述】:

我有以下型号:

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 可以做到吗?

【问题讨论】:

    标签: django django-models django-orm django-aggregation


    【解决方案1】:

    您可以直接计算views__user 并在此聚合上应用distinct=True,而不是计算views

    qs = Post.objects.all().annotate(
        total_views=Count('views__user', distinct=True, filter=Q(**filters))
    ).order_by('-total_views')
    

    【讨论】:

    • 一天中不同时间的独特视图怎么样? qs = PostView.objects.filter(**filters ).annotate(hour=TruncHour('created')).values('hour').annotate(c=Count('user_id', distinct=True)).values('hour', 'c')。这不起作用。
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 2012-10-20
    • 1970-01-01
    • 2019-07-21
    • 2021-03-28
    • 1970-01-01
    • 2015-09-19
    • 2017-10-20
    相关资源
    最近更新 更多