Django ORM - 过滤相关对象
Posted
技术标签:
【中文标题】Django ORM - 过滤相关对象【英文标题】:Django ORM - filtering on related objects 【发布时间】:2017-02-26 22:31:23 【问题描述】:假设我有一个模型:
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
created = models.DateTimeField(auto_now_add=True)
我想查询所有用户并获得每个用户今天的帖子列表。
这里有一些很好的解决方案,例如使用模型方法或遍历每个用户,但在我看来,它们并没有真正具有良好的性能,因为它们没有使用 ORM。
或许有像User.objects.all().annotate(filtered_posts = ...)
这样的方式?
【问题讨论】:
【参考方案1】:您说您想通过“今天的帖子”进行查询,但我没有看到日期时间字段,所以我假设一个。此外,您需要更改相关名称(它描述了从其他模型角度看的名称,因此:related_name='posts'
会更合适)。
__
查询时可以访问相关对象,例如
User.objects.filter(posts__created=time)
这将返回今天创建帖子的用户的查询集。
请注意,我用作示例的time
变量是另一件事。例如,您可能希望使用 posts__created_at__range
提供今天午夜到明天午夜的 2 元素元组。
【讨论】:
哦,对不起,我把相关名称弄乱了,忘记了日期字段。我现在已经修好了。但是你没有正确理解我。我不想按日期过滤用户,但我需要用按日期过滤的帖子序列化用户对象。 你试过我写的代码了吗?我认为它将完全按照您的描述进行 - 将返回Users
,其帖子在特定的 create
日期创建。如您所说,按日期过滤Users
将按User.objects.filter(created=time)
进行,我在示例中使用了posts__created=time
。如果我在这里错了,我将不得不请你改写问题。以上是关于Django ORM - 过滤相关对象的主要内容,如果未能解决你的问题,请参考以下文章