/ / Django най-добри практики с моделни връзки - django, django-models

Най-добра практика на Джанго с модели връзки - django, django-models

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)