Как следующая структура данных лучше всего представлена в наборе моделей баз данных Django:
Top level element
An unknown number n of Mid level element(s), n >= 1
Low level element
Например:
Top
Mid
Mid
Mid
Bottom
или же
Top
Mid
Bottom
Проблема в том, что модель для элемента среднего уровня не может иметь в качестве родительских элементов одновременно элемент среднего уровня и элемент верхнего уровня. Я могу придумать следующие решения:
Модель среднего уровня может иметь отношения внешнего ключа с Top, а другая - с 'self'. Это кажется хакерским, потому что, если вы хотите двигаться вниз по слоям, вы должны проверять оба ключа на каждом слое - когда вы знаете, что только первый Mid связан с Top, а все остальное связано с Mid.
class Mid(models.Model):
top_parent = models.ForeignKey(Top, blank=True, null=True)
mid_parent = models.ForeignKey('self')
Полностью исключите Top, чтобы Mid всегда связывались с другими Mid. Проблема с этим решением заключается в том, что Top имеет некоторые уникальные свойства, которые я не хочу добавлять в Mid, если этого можно избежать.
Используйте общие отношения, чтобы Mid мог связываться как с Top, так и с Mid. Обратной стороной является то, что это значительно усложняет код.
Вот связанный с этим вопрос, который я нашел чуть позже: Django: как смоделировать дерево разнородных типов данных?






Ответ мог быть: сделать Top прокси-моделью Mid.
class Mid(models.Model):
mid_parent = models.ForeignKey('self')
class Top(Mid):
# here you have your unique properties
class Meta:
proxy = True
Поскольку поле mid_parent является обязательным, экземпляр Top может иметь имя mid_parent.
Не могли бы вы объяснить, почему ответ неточный? Большое спасибо.