我需要在django中进行条件排序,但不知道该怎么做。
我有两个模型:User
和Post
。 Post
模型有seen_users = ManyToManyField(User)
字段。
我想收到所有帖子,但我看到的帖子应该是最初的。
我尝试过这段代码:
Post.objects.all().annotate(
is_seen=Case(
When(seen_users__id__exact=me.id, then=1),
default=0,
output_field=IntegerField()
)
).order_by('-is_seen', '-created')
但是这个会返回重复的帖子。我试图添加distinct
但没有运气。
答案 0 :(得分:2)
因此,根据我的理解,您会看到有序收集的帖子以及未见的帖子。您可以通过以下方式完成此操作。
id seen_users_id
中的单个下划线不是拼写错误。您可以在不加入表的情况下访问id,这将最终成为更有效的查询。
seen = Posts.objects.filter(
seen_users_id=me.id
).order_by('-created')
not_seen = Posts.objects.exclude(
seen_users_id=me.id
).order_by('-created')
posts = list(seen) + list(not_seen)
所以这解决了你的问题,但有两个问题。您可能尝试使用orm支持的union来使其成为一个查询。
all_posts = lists(seen.union(not_seen))
以上只会向数据库进行一次往返。但是,您可能需要注释两个查询以区分和未查看。但它不应该显示任何重复。