Вложенные категории работают некорректно в Django

Я работаю над проектом, который содержит много деталей и дополнительной информации. Мне нужно использовать вложенные категории для моей панели навигации, в первый раз, когда я запустил код, он работал правильно, но затем, когда я столкнулся с ошибкой при миграции и мне пришлось снова создать проект, он больше не работает.

У меня есть два разных типа кодирования для этой вложенной категории, и ни один из них не работает!

class Category(MPTTModel):
name = models.CharField(max_length=30)
slug = models.SlugField(allow_unicode=True, blank=True, null=True,
                        unique=True)
parent = models.ForeignKey('self', default=None, null=True,
                           blank=True, on_delete=models.SET_NULL,
                           related_name='children')
is_child = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

class Meta:
    verbose_name = _('category')
    verbose_name_plural = _('categories')

def __str__(self):
    return self.name

этот первый и этот второй:

class Category(MPTTModel):
name = models.CharField(max_length=100)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True,
                        related_name="children")
is_child = models.BooleanField(default=False)
slug = models.SlugField(unique=True, null=True, blank=True, allow_unicode=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

class Meta:
    verbose_name = _('category')
    verbose_name_plural = _('categories')

def __str__(self):
    return self.name

Когда я создаю новую категорию как дочернюю, она должна быть включена в свою родительскую. Но ничего не происходит и она создается просто как отдельная категория. Я буду очень рад, если вы сможете помочь мне с этим.

При работе с деревом лучше не использовать ORM и MPTT

например:

team = StaffMember.objects.raw('''
WITH RECURSIVE team(id, supervisor) AS (
      SELECT id, supervisor 
      FROM staff_member
      WHERE id = 42
    UNION ALL
      SELECT sm.id, sm.supervisor
      FROM staff_member AS sm, team AS t
      WHERE sm.id = t.supervisor
    )
 SELECT * FROM team
 ''')

или

def get_all_children(self, include_self=True):
table_name = Account.objects.model._meta.db_table
query = (
    "WITH RECURSIVE children (id) AS ("
    f"  SELECT {table_name}.id FROM {table_name} WHERE id = {self.pk}"
    "  UNION ALL"
    f"  SELECT {table_name}.id FROM children, {table_name}"
    f"  WHERE {table_name}.parent_id = children.id"
    ")"
    f" SELECT {table_name}.id"
    f" FROM {table_name}, children WHERE children.id = {table_name}.id"
)
if not include_self:
    query += f" AND {table_name}.id != {self.pk}"
return Account.objects.filter(
    pk__in=[account.id for account in Account.objects.raw(query)]
)

если вы используете postgres, прочитайте следующую ссылку

https://www.postgresql.org/docs/current/queries-with.html#QUERIES-WITH-RECURSIVE

Вернуться на верх