Django ORM - построение иерархической структуры данных с несколькими моделями
Как часть проекта, над которым я работаю, я пытаюсь построить иерархическую структуру данных объектов разных типов.
я использовал django-mptt
для этого, который обещает обрабатывать деревья умным способом с быстрыми запросами.
Проблема в том, что у меня есть несколько моделей, которые должны участвовать в этом дереве данных, поэтому я использовал общее отношение для хранения необходимых данных.
Фрагмент модели, которую я построил:
class CPNode(MPTTModel):
content_type = models.ForeignKey(ContentType, null=True, blank=True)
object_id = models.PositiveIntegerField(null=True)
content_object = GenericForeignKey('content_type', 'object_id')
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
...
Это дает мне то, что я хочу, кроме вопроса вопроса.
Я полагаю, что запрос всех данных будет стоить несколько запросов (каждый раз, когда я хотел бы получить сам content_object).
Кто-нибудь имеет представление о том, как я могу поддерживать эту структуру, и в то же время быть в состоянии получить все данные в масштабируемом запросе?
1 ответ
Реляционные базы данных (по крайней мере, базы данных SQL) не так уж хороши, когда дело доходит до разнородных деревьев... MPTT действительно значительно улучшит скорость чтения, избегая необходимости рекурсивных запросов, но это не решит проблему. GenericForeignKey
хак - просто нет возможности реализовать такую функцию на уровне SQL, поэтому, если вы ее используете, да, вам потребуется еще один запрос на узел, чтобы получить эффективный контент.
Единственный способ избежать этих лишних запросов состоит в том, чтобы заполнить каждое поле каждого подтипа узла в той же модели, добавить к нему поле "node_type" и использовать прокси-модели для каждого типа узла. Код не будет красивым (был здесь, сделал это), но хорошо, здесь есть несколько других вариантов...