gpt4 book ai didi

python - 将查询合并为一个,然后按日期排序

转载 作者:行者123 更新时间:2023-12-01 09:15:01 24 4
gpt4 key购买 nike

我有 3 张 table 。用户、发帖和分享。 Post 是一个包含所有帖子的表。 Post 与 Share 是一对多的关系。话虽如此,共享表是一个指示用户共享了哪些帖子的表。表的结构如下:

class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(max_length=200)

share_count = models.IntegerField(default=0)

created_at = models.DateTimeField(auto_now_add=True)
url = models.CharField(max_length=150)

class Share(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
shared_at = models.DateTimeField(auto_now_add=True)

我特别想要的是一个查询,它可以获取用户共享的帖子以及用户创建的帖子。例如,假设我们有相同的数据:

帖子表

id    user    status    share_count    created_at    url
1 1 hello 32 2017-06-01 hello
2 2 What's up 22 2017-07-01 whats-up

共享表格

post    user   shared_at
2 2 2017-07-02

我想要一个查询来获取用户的共享帖子+他们的帖子。假设我想为用户 1 执行此操作。结果应该是帖子 1 和帖子 2,因为用户发布了帖子 1,并且还共享了用户 2 的帖子 2。到目前为止,我得到的是:来自 itertools 导入链

user = User.objects.get(pk=1) # pick a user

own_posts = user.post_set.order_by('-created_at')
shared_posts = user.share_set.order_by('-shared_at')

combined = itertools.chain(own_posts, shared_posts)

def get_ts(obj):
try:
return obj.created_at
except AttributeError:
return obj.shared_at

last_5 = sorted(combined, key=get_ts, reverse=True)[:5]

执行最后一行后出现此错误:

TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'

我怎样才能做到这一点?为什么我会收到此错误?

最佳答案

我认为你把事情弄得很复杂。这里的核心问题是您的集合包含两种类型的元素Postshare。我真的建议您不要这样做,因为这只会使处理它变得更加困难。

但是,我们可以构造一个查询集,该查询集将返回由用户发布或由该用户共享的帖子。例如:

from django.db.models import <b>Q</b>
from django.db.models.functions import <b>Coalesce</b>

Post.objects.filter(
<b>Q(user=some_user) |
Q(share__user=some_user)</b>
).annotate(
<b>shared_or_created=Coalesce('share__shared_at', 'created_at')</b>
).order_by(<b>'-shared_or_created'</b>)

现在我们有了一个由 some_user 创建或由 some_user 共享的帖子列表。接下来,我们使用 shared_or_created 字段注释每个帖子,该字段包含共享的时间,或者如果未共享(由用户创建),则包含创建的时间。最后我们按降序对该属性进行排序。

将其编码到查询中的优点是它是在数据库级别处理的。此外,它仍然是一个查询集,因此您可以在其上添加额外的过滤器、切片等。

关于python - 将查询合并为一个,然后按日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51346126/

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