/ / Django meilleure pratique avec les relations entre modèles - django, django-models

Meilleure pratique de Django avec les relations de modèle - 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)

Est la meilleure pratique ci-dessus pour l'organisationrelations ou dois-je combiner les modèles pour chat / sous-chat pour le rendre plus comme un système de marquage? Par exemple, un produit peut être étiqueté avec "Cat A" et "Sub Cat A". L'application n'a pas besoin d'avoir des catégories ajoutées après son lancement.

Réponses:

1 pour la réponse № 1

Cela dépend vraiment de vos besoins. Si vous "écrivez un programme pour un système qui ne nécessite qu'une hiérarchie à deux niveaux, alors ce que vous avez fait est parfaitement bien. Si vous pouvez imaginer un moment où vous pourriez avoir une hiérarchie plus compliquée, les combiner a du sens.

Vous mentionnez un "produit", ce qui me donne à penser que vous voulez une hiérarchie stricte pour que vos modèles actuels semblent bien.


4 pour la réponse № 2

Pour plus de flexibilité, la structure du modèle que j'utilise pour cela est comme ça:

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)

Donc, si une catégorie n'a pas de parent_category, alors c'est une base, si c'est le cas, alors c'est une sous-catégorie.

Dans cette hiérarchie, vous pouvez définir une profondeur infiniede la hiérarchie catégorie-sous-catégorie, mais sur la couche d'affichage, vous devez écrire des lignes de mode pour obtenir la liste de catégories appropriée sous forme d'arborescence (par exemple, filtrer d'abord les catégories avec isnull = True, puis parcourir.). Mais avec quelques boucles bien codées et si vérifie, vous pouvez le faire.


1 pour la réponse № 3

Plus flexible sera le code

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)