在我的 django 博客应用程序中,我有一个书签模型,其中包括指向 Post 和 User 的字段,以及一个用于创建书签的时间的字段。
# models
class Post(models.Model):
# ...
title = models.CharField(max_length=70)
body = RichTextField()
author = models.ForeignKey(
UserProfile,
on_delete=models.CASCADE,
related_name='posts')
created_on = models.DateTimeField(default=timezone.now)
# ...
class Meta:
ordering = ['created_on']
class Bookmark(models.Model):
post = models.ForeignKey(
Post, on_delete=CASCADE,
related_name="bookmarked_post"
)
user = models.ForeignKey(
User, on_delete=CASCADE,
related_name="bookmarks"
)
created_on = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ['created_on']
我想显示用户的书签。我想按照书签的顺序对帖子查询集进行排序,首先是最近添加书签的帖子。
# views.py
@login_required
def bookmarks_view(request):
bookmarks = Bookmark.objects.filter(user=request.user)
bookmarked_posts = Post.objects.filter(
bookmarked_post__in=bookmarks).order_by(???)
return render(request, 'bookmarks.html', {'posts': bookmarked_posts})
我正在努力弄清楚如何通过 Bookmark 模型中的 created_on 字段对我的 Posts 查询集进行排序。为了增加额外的复杂性,Post 和 Bookmark 模型都有一个 created_on 字段。
谁能指出我正确的方向?我已经搜索了 django 文档和 SO 并没有找到我需要的东西,可能我只是不知道正确的关键字......或者我是否错误地设置了我的模型来实现我想要的?
答案 0 :(得分:0)
这样的事情应该可以工作:
bookmarks = Bookmark.objects.filter(user=u0)
bookmarked_posts = Post.objects.filter(
bookmarked_post__in=bookmarks
).order_by("-bookmarked_post__created_on")
您可以删除末尾的 __created_on
- Django 将使用相关模型上指定的默认 ordering
。开头的 -
表示降序,因此较新的日期在前。
另见the documentation for order_by:
<块引用>要按不同模型中的字段排序,请使用与跨模型关系查询时相同的语法。即,字段名称,后跟双下划线 (__
),后跟新模型中的字段名称,依此类推,适用于您想要加入的模型。
因为你指定了相关名称为bookmarked_post
,所以这也是你需要指定的字段名称,从Post
的角度来看,就像你在filter
中使用的一样.
如果没有 related_name
,它看起来像这样:
bookmarks = Bookmark.objects.filter(user=u0)
bookmarked_posts = Post.objects.filter(
bookmark__in=bookmarks
).order_by("-bookmark__created_on")
(请注意,您可能希望在 post
模型上为 user
和 Bookmark
指定 a unique_together
constraint,以确保每个用户只能为帖子添加一次书签)