【问题标题】:Django conditional order by with many to many field具有多对多字段的 Django 条件排序
【发布时间】:2018-03-30 18:01:12
【问题描述】:

我需要在 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,但没有成功。

【问题讨论】:

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


    【解决方案1】:

    因此,据我了解,您是在有序收集可见的帖子和不可见的帖子。您可以通过以下方式完成此操作。

    seen_users_id 中用于 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 支持的联合来使其成为一个查询。

    all_posts = lists(seen.union(not_seen))
    

    以上内容只会对数据库进行一次往返。但是您可能必须对这两个查询进行注释以区分和未见。但它不应该显示任何重复。

    【讨论】:

    • 那么就没有办法只用一个查询吗?
    • @Bulgantamir 添加了更多解释如何完成。这样就解决问题了吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多