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 - 过滤相关对象的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM:按相关表过滤器的聚合排序

Django ORM:按对象列表过滤

Django通过多对多ORM对象中的多个标签进行过滤

Django ORM 按过滤器排序

Django orm总结

django orm总结--解决查询结果不区分大小写问题