Вложенные категории работают некорректно в 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