Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有多对多字段的Django条件排序依据_Python_Sql_Django_Postgresql_Many To Many - Fatal编程技术网

Python 带有多对多字段的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

我需要在django条件排序,但不知道如何做

我有两种型号:
User
Post
Post
model have
seed\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进一步解释了如何做到这一点。这样就解决了问题,对吗?