Я ищу эффективный способ моделирования категорий продуктов и произвольного количества вложенных подкатегорий в Django для целей электронной коммерции.То, что у меня сейчас есть, работает, но это становится проблемой, когда вы хотите выполнить запрос, чтобы получить все, скажем, книги, потому что вам нужно сначала рекурсивно просмотреть все подкатегории «Книги», а затем получить все книги из этих подкатегорий.
Допустим, у вас есть учебник по математике для начальной школы, он будет принадлежать:
Книги -> Учебники -> Начальная школа
... и получить все книгинужно было бы выполнить монстр-запрос, подобный этому:
>>> from products.models import Product, Category
>>> from django.db.models import Q
>>> c = Category(name='Books')
>>> c.save()
>>> c1 = Category(name='Textbooks', parent=c)
>>> c1.save()
>>> c2 = Category(name='Primary school', parent=c1)
>>> c2.save()
>>> p = Product(title='Math textbook', description='Math textbook for 4th grade', price=20, category=c2)
>>> p.save()
>>> Product.objects.filter(Q(category__name='Books') | Q(category__parent__name='Books') | Q(category__parent__parent__name='Books'))
<QuerySet [<Product: Product object (3)>]>
... что неэффективно, и вы не можете заранее знать, как будут вложены категории.
Вот какупрощенные модели выглядят так:
class Product(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
price = models.DecimalField(decimal_places=2, max_digits=10)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
class Category(models.Model):
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
name = models.CharField(max_length=255)