Django条件顺序由多对多字段组成

时间:2017-10-18 18:59:51

标签: python sql django postgresql many-to-many

我需要在django中进行条件排序,但不知道该怎么做。

我有两个模型:UserPostPost模型有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但没有运气。

1 个答案:

答案 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))

以上只会向数据库进行一次往返。但是,您可能需要注释两个查询以区分和未查看。但它不应该显示任何重复。