I have following models:
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)
I want to get posts ordered by number of unique views. I get the posts ordered by views by following code:
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')
above code will calculate all views as total_views
. I want to get unique views by user
.
Is it possible to do that with ORM?
Instead of counting
views
, you can countviews__user
directly and apply adistinct=True
on this aggregation: