Python(Django) 如何按时间戳属性对对象列表进行排序
Python(Django) how to sort a list of objects by timestamp attribute
我有一个使用 python 函数创建的对象列表 'posts',我需要按时间戳属性对该列表进行排序。
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'
如何按时间戳对列表进行排序,使最新的 post 排在第一位?
这是models.py
中的Postclass
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,但我不知道该怎么做。谢谢!
您可以使用 __in
field lookup 来过滤您的帖子,然后对该查询集进行排序。类似于:
Post.objects.filter(
user__in=Follow.objects.filter(
follower=request.user
).values_list('user')
).order_by("-timestamp")
我们首先构建一个查询集来过滤所有 Follow
对象,其中 follower
等于当前用户 (request.user
)。接下来,我们通过调用 values_list
获得所有过滤的 Follow
对象上的所有 Follow.user
对象。我们将此查询集传递给过滤 Post
对象,其中 user
属性在此查询集中。然后我们只按时间戳排序。
我有一个使用 python 函数创建的对象列表 'posts',我需要按时间戳属性对该列表进行排序。
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'
如何按时间戳对列表进行排序,使最新的 post 排在第一位?
这是models.py
中的Postclassclass 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,但我不知道该怎么做。谢谢!
您可以使用 __in
field lookup 来过滤您的帖子,然后对该查询集进行排序。类似于:
Post.objects.filter(
user__in=Follow.objects.filter(
follower=request.user
).values_list('user')
).order_by("-timestamp")
我们首先构建一个查询集来过滤所有 Follow
对象,其中 follower
等于当前用户 (request.user
)。接下来,我们通过调用 values_list
获得所有过滤的 Follow
对象上的所有 Follow.user
对象。我们将此查询集传递给过滤 Post
对象,其中 user
属性在此查询集中。然后我们只按时间戳排序。