Создание иерархического дерева категорий в Django
У меня есть большой CSV (27k + строк), который я хочу импортировать в модель и оттуда создать иерархическое дерево в шаблоне.
Пример
Дочерние категории имеют глубину до 9 уровней.
Я думал, что MPTT может быть подходящим способом из-за размера набора данных, но в учебнике не говорится о большом импорте, и я не могу экстраполировать, как использовать их пример в большом наборе данных.
Я не женат на mptt, я был бы не против даже сделать это с несколькими таблицами и как-то связать их как многие к одному.
Это подводит меня к моему вопросу:
Как связать дочерний элемент с родительским в большом наборе, который нельзя набрать вручную?
Снимок экрана категории
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"?