【问题标题】:Django ORM - Filter Related ObjectsDjango ORM - 过滤相关对象
【发布时间】:2018-11-18 19:52:12
【问题描述】:

如果这是重复的,我深表歉意,但我找不到任何其他解决此问题的 SO 帖子。我有这样的模型:

class Person(models.Model):
    pass

class Interest(models.Model):
    person = models.ForeignKey(Person, related_name='interests')
    is_cool = models.BooleanField()

我知道我可以找到所有有类似兴趣的人:

Person.objects.filter(interests__is_cool=True)

然而,我真正想要的是当我获得Person 对象时只获得他们的酷兴趣。我知道我总是可以提取相关的查询集并对其进行操作,如下所示:

interests = person.interests.filter(is_cool=True)

但我无法将其分配回 person 实例,因为关系颠倒了。总而言之,目标是直接使用 ORM 来过滤 Interest 查询集中返回的 Interest 对象。

【问题讨论】:

  • 我认为这可能会破坏大多数设计原则:您通常不希望以改变相关管理器的方式进行过滤。您当然可以创建像 cool_interests 之类的经理。因此,除非手动将 .interests 入侵特定的人,否则这听起来是个坏主意。

标签: python django django-models django-orm


【解决方案1】:

一种可能性是在模型上定义方法或属性:

def cool_interests(self):
    return self.interests.filter(is_cool=True)

【讨论】:

  • 在这种情况下,过滤是动态的,并且基于用户提供的输入(示例代码只是一个人为的示例)。因此不能是属性。
猜你喜欢
  • 2022-06-12
  • 2017-07-02
  • 1970-01-01
  • 2010-09-20
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多