Создание иерархического дерева категорий в Django

У меня есть большой CSV (27k + строк), который я хочу импортировать в модель и оттуда создать иерархическое дерево в шаблоне.

Пример

Hierarchical Example

Дочерние категории имеют глубину до 9 уровней.

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

Я не женат на mptt, я был бы не против даже сделать это с несколькими таблицами и как-то связать их как многие к одному.

Это подводит меня к моему вопросу:

Как связать дочерний элемент с родительским в большом наборе, который нельзя набрать вручную?

Снимок экрана категории

category screenshot

mptt tutorial example

from myapp.models import Genre

rock = Genre.objects.create(name="Rock")
blues = Genre.objects.create(name="Blues")
Genre.objects.create(name="Hard Rock", parent=rock)
Genre.objects.create(name="Pop Rock", parent=rock)

То, что я пробовал

Я знаю, что это неправильно на многих уровнях. Это не лучшее использование времени/пространства на большом множестве.

def show_categories(request):
    categories = Categories.objects.all()
    parents = {}
    children = {}
    for cat in categories:
        if cat.cat_parent_id == 0:
          parents[cat.cat_name] = cat.category_id
        if cat.cat_parent_id > 0:
          children[cat.cat_name] = cat.cat_parent_id
    return render(
      request,
      "amazon_niche_finder/categories.html",
      {
          "parents": parents,
          "children": children,
      },
    )  

Вот мой импорт. Я пробовал варианты приведенного выше кода с этим импортом CSV, а не в представлении, но безуспешно.

with open(path, "rt") as f:
        reader = csv.reader(f, dialect="excel")
        next(reader)
        Categories.objects.bulk_create([
            Categories(
                category_id=int(row[0]),
                cat_name=row[1],
                cat_parent_id=int(row[2]),
                cat_level=int(row[3]),
                cat_link=row[4],
            ) for row in reader
        ])

Модель

class Categories(models.Model):
cat_id = models.IntegerField(null=False, name="category_id")
cat_name = models.CharField(max_length=100,
                            null=False,
                            name="cat_name",
                            default="")
cat_parent_id = models.IntegerField(null=False, name="cat_parent_id")
cat_level = models.IntegerField(null=False, name="cat_level")
cat_link = models.URLField(null=True, name="cat_link")

Моя самая большая проблема - это привязка дочерних элементов к родительскому. В частности, как мне сказать "если parent_id == 1, то поместите меня под cat_id 1"?

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