我有一个使用此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,但是我不知道该怎么做。谢谢!
答案 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
对象。然后我们只需按时间戳排序即可。