Как запросить иерархическую модель и избежать избыточного выделения памяти для одного и того же объекта?
Используемые модели:
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Department(models.Model):
president = models.ForeignKey(to=Person, on_delete=models.CASCADE, related_name='+')
vice_president = models.ForeignKey(to=Person, on_delete=models.CASCADE, related_name='+')
name = models.CharField(max_length=128)
def __str__(self):
return f'{self.name} lead mainly by {self.president} (and secondly by {self.vice_president})'
Запрос выполнен:
for department in Department.objects.all():
print(hex(id(department.president)), department.president, department)
print(hex(id(department.vice_president)), department.vice_president, department)
Ожидаемый результат:
0x1bbeca18960 Joe Marketing lead mainly by Joe (and secondly by Tom)
0x1bbeca18c70 Tom Marketing lead mainly by Joe (and secondly by Tom) <-- SAME instance of "Tom"
0x1bbeca18c70 Tom Financing lead mainly by Tom (and secondly by Bob) <-- as this instance of "Tom"
0x1bbeca18e80 Bob Financing lead mainly by Tom (and secondly by Bob)
Фактический результат:
0x1bbeca18960 Joe Marketing lead mainly by Joe (and secondly by Tom)
0x1bbeca18c70 Tom Marketing lead mainly by Joe (and secondly by Tom) <-- DIFFERENT instance of "Tom"
0x1bbeca18a30 Tom Financing lead mainly by Tom (and secondly by Bob) <-- than this instance of "Tom"
0x1bbeca18e80 Bob Financing lead mainly by Tom (and secondly by Bob)
Мотивация:
Когда у меня есть 100 человек и 100 отделов, я хочу получить общее распределение 100 экземпляров "отдела" и 100 экземпляров "человека", но вместо этого есть общее распределение 100 экземпляров "отдела" и 200 экземпляров "человека"