Лучший подход при нескольких типах узлов в модели 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)
Вернуться на верх