Django模型查询

时间:2017-09-24 17:00:39

标签: python django model django-rest-framework

我有以下两种型号:

class User(models.Model):
    user_id = models.IntegerField(null=True)
    name = models.CharField(max_length=50)

class Blog(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(User, null=True)
    timestamp = models.DateTimeField()

如何编写Django模型查询以获取具有以下形式的对象列表 -

[(user_object, number of blog posts of this user), ...]

此列表应按降序排列。基本上,我想获取有关用户编写了多少博客文章的信息。

Incase,2位用户拥有相同数量的博客文章,我希望根据他们创建的博客帖子的最新时间戳对其进行排序。

所以,到目前为止,我已经尝试了以下方法,并且在我的方法中仍然没有成功。

    user = User.objects.all()
    serializer = UserSerializer(user, many=True)
    user = list(serializer.data)
    user_ranks = [(key, len(list(group))) for key, group in groupby(user)]
    user_ranks = sorted(user_ranks, key=lambda x: x[1], reverse=True)

我不知道如何将timestamp比较插入上述代码中。此外,还有更好的方法来实现这一目标吗?

P.S:User中的条目数与Blog中的条目数相同

1 个答案:

答案 0 :(得分:1)

如果你设置

user = models.ForeignKey(User, null=True, related_name='bloguser')

您可以使用

from django.db.models import Count
some_query = User.objects.filter( ... ).annotate( foobar = count('bloguser') )

附加博客数量,然后您可以通过some_query.foobar在模板中访问这些博客。

表示时间戳

some_query = User.objects.filter( ... ).annotate( foobar = count('bloguser') ).annotate( foomax = Max('bloguser__timestamp') )