Запрос ORM с несколькими левыми соединениями - PullRequest
0 голосов
/ 16 апреля 2019

Пример игрушки: Допустим, у меня есть следующие модели:

# Person ---lives_in--> City ---part_of---> State

class Person(models.Model)
    name = models.CharField(max_length=100)
    lives_in = models.ForeignKey('City', on_delete=models.CASCADE)

class City(models.Model)
    name = models.CharField(max_length=100)
    part_of = models.ForeignKey('State', on_delete=models.CASCADE)

class State(models.Model):
    name = models.CharField(max_length=100)

Как получить список людей, которые живут в определенном штате, используя Django ORM?

В обычном SQL это будет что-то вроде

SELECT p.* 
FROM person p
LEFT JOIN city c ON (p.lives_in = c.id)
LEFT JOIN state s ON (c.part_of = s.id)
WHERE c.name = 'MA'

1 Ответ

1 голос
/ 16 апреля 2019

Вы можете просто пройти через отношения, используя обозначение __.

people_in_ma = Person.objects.filter(lives_in__part_of__name="MA")

https://docs.djangoproject.com/en/2.2/topics/db/queries/#lookups-that-span-relationships

...