gpt4 book ai didi

python - 具有多对多字段的 Django 条件排序

转载 作者:行者123 更新时间:2023-11-29 12:54:25 24 4
gpt4 key购买 nike

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

最佳答案

因此,据我了解,您是在按顺序收集已查看和未查看的帖子。您可以通过以下方式完成此操作。

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

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

关于python - 具有多对多字段的 Django 条件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46817346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com