【问题标题】:Reverse look-up with related name具有相关名称的反向查找
【发布时间】:2021-12-06 05:06:17
【问题描述】:

假设这些模型:

class Person (models.Model):
    pass

class Marriage (models.Model):
    person = models.ForeignKey(Person, on_delete = models.CASCADE, related_name='person')
    person_2 = models.ForeignKey(Person, on_delete = models.CASCADE, related_name='person_2')

如何通过婚姻字段的 ID(例如 ID)过滤人员?也就是说,我的目标是做一些类似 Person.objects.filter(marriage__id=32) 的事情。我知道相关名称在那里有一些作用,但例如 Person.objects.filter(person_2__marriage__id=32) 似乎也不起作用。

谢谢!

【问题讨论】:

  • 在您这样误称相关名称后,没有更多的marriage 名称可供访问。 Person.objects.filter(person_2_id=32) 会起作用。
  • 我才意识到我的错误。谢谢!
  • 婚姻模型有额外的字段吗?
  • 是的,还有一些。

标签: python django django-queryset


【解决方案1】:

据说您可以删除 related_name 并使用以下构造:

mariage = Mariage.objects.get(id=32)
person = mariage.person
person2 = mariage.person_2

但是,这取决于您要达到的目标。像这样的东西:

class Marriage (models.Model):
    person = models.ForeignKey(Person, on_delete = models.CASCADE, related_name='mariage_person_1')
    person_2 = models.ForeignKey(Person, on_delete = models.CASCADE, related_name='mariage_person_2')

您应该能够运行以下查询:

from django.db.models import Q
query = Q(mariage_person_1=32) | Q(mariage_person_2=32)
persons = Person.objects.filter(query)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2019-12-26
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多