Набор запросов, содержащий связанный объект с тем же внешним ключом

например, у меня есть человек с адресом

class Persons(models.Model):
adress = models.ForeignKey(Adress, on_delete=models.DO_NOTHING, blank=True,
                                   null=True)
class Adress(models.Model):
some_data = models.IntegerField()

и у меня есть другие связанные данные в другой модели, как это

class Places(models.Model):
adress = models.ForeignKey(Adress, on_delete=models.DO_NOTHING)

как получить набор запросов, состоящий из персон и мест, если адрес задан в персонах?

Вы можете получить Places объекта Persons с помощью:

Places.object.filter(adress__persons=myperson)

Если вы хотите сделать это оптом, вы можете работать с:

qs = Persons.objects.select_related('adress').prefetch_related('adress__places_set')

это загрузит связанные Places в большом количестве, так что вы можете получить их с помощью:

for person in qs:
    print(person.adress.places_set.all())

Вы можете сделать что-то вроде этого, но сначала вам нужно добавить related_name в ваш внешний ключ Persons and Places Foreign key

class Persons(models.Model):
     adress = models.ForeignKey(Adress,related_name = "persons_adress",on_delete=models.DO_NOTHING, blank=True,null=True)
class Adress(models.Model):
     some_data = models.IntegerField()
class Places(models.Model):
     adress = models.ForeignKey(Adress, related_name = "places_addres",on_delete=models.DO_NOTHING)

После этого изменения вы можете запросить

Adress.objects.filter(persons_adress__some_data = some_data,places_addres__some_data = some_data)
Вернуться на верх