Получить всех детей категории id в списке drf

У меня есть такая модель

class Catgeory(models.Model):
      name = models.CharField()
      parent = models.ForeignKey('self', related_name='children')

Теперь мне нужно написать часть кода, чтобы вернуть список всех идентификаторов детей для указанной категории

Например, у меня есть такая категория

General (id=1) --> Electronics (id=2) --> Mobile phones (id=3) --> Apple (id=4)

Если я хочу получить дочерние элементы Электроника, то это должно вернуть [3, 4]. Но я уже 3 часа пытаюсь найти решение, к сожалению, пока не смог. Я могу получить всех родителей по одному ребенку, но не могу получить детей по родителю. Если у кого-нибудь есть решение или какая-нибудь идея, можете ли вы помочь? Любая помощь будет оценена по достоинству! Большое спасибо!

Чтобы получить все дочерние категории, мы можем попробовать подход bfs

models.py

class Catgeory(models.Model):
    name = models.CharField(max_length=60)
    parent = models.ForeignKey('self', related_name='children', on_delete=models.SET_NULL, null=True, blank=True)

views.py

from django.http.response import HttpResponse
from .models import Catgeory

# Create your views here.
def index(request):
    category        = Catgeory.objects.get(id=1)
    child_category  = Catgeory.objects.filter(parent=category)
    queue = list(child_category)
    while(len(queue)):
        next_children = Catgeory.objects.filter(parent=queue[0])
        child_category = child_category.union(next_children)
        queue.pop(0)
        queue = queue + list(next_children)
    return HttpResponse(child_category)

Вы можете попробовать это

class Catgeory(models.Model):
    name = models.CharField()
    parent = models.ForeignKey('self', related_name='children')
    
    def get_all_child(self):
        children = []
        for u in self.children.all():
            children.append(u.get_all_child())
        return children

Но вы должны быть уверены, что у вас нет этого (child==parent), потому что если у вас есть такой случай, у вас будет бесконечный цикл. Будьте осторожны.

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