Лучший подход при нескольких типах узлов в модели MPTT
просто хочу получить некоторую обратную связь, поскольку я пытаюсь повысить эффективность своих моделей. Я использую MPTT для построения иератического контента, который может поддерживать несколько типов контента внутри дерева. Первоначальный подход, который я использовал, заключался в создании модели узла с Generic отношением и отдельных моделей типов узлов с Generic отношением к модели узла. Я видел смешанные чувства по поводу GenericForeignKey, и я испытываю дополнительную работу, связанную с тем, что эти отношения не поддерживаются Django. Например, необходимость вручную связывать узлы, вручную проверять содержимое узла и т.д. Этот способ также приводит к дополнительным запросам к базе данных. Есть ли другой подход к этому? Я пытался смоделировать создание модели Node и наследование различных типов Node, однако, если бы каждая модель имела TreeForeignKey, они также могли бы ссылаться только на свою собственную модель без GenericForeignKey
В настоящее время мои модели построены следующим образом.
class StoryNode(MPTTModel):
story = models.ForeignKey(Story, on_delete=models.RESTRICT, null=True, related_name='storynodes')
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
ending_node = models.BooleanField(default=False)
limit = models.Q(app_label='core', model='storytext') | models.Q(app_label='core', model='storyaction')
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, limit_choices_to=limit)
object_id = models.PositiveIntegerField(blank=True, null=True)
content_object = GenericForeignKey('content_type', 'object_id')
class StoryText(models.Model):
content = models.TextField(max_length=500, help_text="Enter the text for this card")
node = GenericRelation(StoryNode, related_query_name='story-text')
class StoryAction(models.Model):
content = models.CharField(max_length=200, help_text="Enter the user response")
node = GenericRelation(StoryNode, related_query_name='story-action'
class RedirectNode(models.Model):
redirect_node = models.ForeignKey(StoryNode, on_delete=models.DO_NOTHING, null=True, blank=True)