Python 带有多对多字段的Django条件排序依据
我需要在django条件排序,但不知道如何做 我有两种型号:Python 带有多对多字段的Django条件排序依据,python,sql,django,postgresql,many-to-many,Python,Sql,Django,Postgresql,Many To Many,我需要在django条件排序,但不知道如何做 我有两种型号:User和PostPostmodel haveseed\u users=ManyToManyField(User)field 我想得到所有的帖子,但我看到的帖子应该在第一个 我已尝试使用以下代码: Post.objects.all().annotate( is_seen=Case( When(seen_users__id__exact=me.id, then=1), def
User
和Post
Post
model haveseed\u users=ManyToManyField(User)
field
我想得到所有的帖子,但我看到的帖子应该在第一个
我已尝试使用以下代码:
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')
但这一个返回重复的帖子。我试图添加不同的,但没有成功。因此,据我所知,您正在查找一组有序的已看到和未看到的帖子。您可以通过以下方式实现这一点 id的
seed\u users\u 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))
以上内容只会往返数据库一次。但是,您可能必须对这两个查询进行注释,以区分“未看到”和“未看到”。但它不应该显示任何副本 “那么一个查询就没有办法做到这一点了?”Bulgantamir进一步解释了如何做到这一点。这样就解决了问题,对吗?