class Category(models.Model):
name = models.CharField(max_lenth=50)
class SubCatergory(models.Model):
parent_category = models.ForeignKey(Category)
name = models.CharField(max_length=100)
class Product(models.Model):
sub_category = models.ManytoManyField(SubCatergory)
name = models.CharField(max_length=100)
По-горе е най-добрата практика за организираневзаимоотношения или трябва да комбинирам моделите за котка / суб котка, за да е по-скоро като система за маркиране? Например продукт може да бъде маркиран с "Cat A" и "Sub Cat A". Приложението няма да трябва да има добавени категории към него след старта.
Отговори:
1 за отговор № 1Това наистина зависи от вашите изисквания. Ако пишете програма за система, която изисква само йерархия на две нива, тогава това, което сте направили, е напълно добре. Ако можете да си представите време, в което може да имате по-сложна йерархия, тогава комбинирането им има смисъл.
Споменавате „продукт“, което за мен предполага, че искате строга йерархия, така че сегашните ви модели да изглеждат добре.
4 за отговор № 2
За по-голяма гъвкавост, структурата на модела, която използвам за такава, е такава:
class Category(models.Model):
parent_category = models.ForeignKey("self", null=True, blank=True)
name = models.CharField(max_lenth=50)
class Product(models.Model):
categories = models.ManytoManyField(Catergory)
name = models.CharField(max_length=100)
Така че, ако категорията няма родителска_категория, то тя е основна, ако има, значи е подкатегория.
В тази йерархия можете да определите безкрайна дълбочинана йерархията на категориите и подкатегориите, но на слой изглед трябва да напишете редове на режима, за да получите правилното изброяване на категория като дърво (например, първо филтрирайте категориите с isnull = True, след което преминете надолу.). Но с няколко добре кодирани бримки и ако проверите, можете да го направите.
1 за отговор № 3
По-гъвкав ще бъде кодът
class Category(models.Model):
name = models.CharField(max_lenth=50)
class SubCatergory(Category):
parent_category = models.ForeignKey(Category)
class Product(models.Model):
categories = models.ManytoManyField(Catergory)
name = models.CharField(max_length=100)