Python(Django)如何通过时间戳属性对对象列表进行排序

时间:2020-10-09 17:06:16

标签: python django django-models django-queryset

我有一个使用此python函数创建的对象“帖子”的列表,我需要按timestamp属性对该列表进行排序。

def following(request):
    posts=[]
    follows=Follow.objects.all()
    for follow in follows:
        if follow.follower==request.user:
            posts_user=Post.objects.filter(user=follow.user)
            for post in posts_user:
                posts.append(post)
        
    
    return render(request, "network/following.html",{
        "posts":posts
    })

如果这是一个QuerySet,我将使用以下函数进行排序:

posts = posts.order_by("-timestamp").all()

但这是一个列表,因此我无法使用此功能,它给了我这个错误:

'list' object has no attribute 'order_by'

如何按时间戳对列表进行排序,以使最新的帖子成为第一篇?

这是models.py中的Post类。

class Post(models.Model):
    user = models.ForeignKey("User", on_delete=models.CASCADE, related_name="user_post")
    text=models.TextField(blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    likes=models.IntegerField(default=0)

我的想法是将列表转换为QuerySet,但是我不知道该怎么做。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用__in field lookup来过滤帖子,然后订购该查询集。像这样:

Post.objects.filter(
    user__in=Follow.objects.filter(
        follower=request.user
    ).values_list('user')
).order_by("-timestamp")

我们首先构建一个查询集,以过滤Follow等于当前用户(follower)的所有request.user对象。接下来,我们通过调用Follow.user获得所有这些过滤的Follow对象上的所有values_list对象。我们传递此查询集以过滤Post属性在此查询集内的user对象。然后我们只需按时间戳排序即可。