2010-08-31 14 views
1

Je cherche des conseils/opinions sur la meilleure façon d'aborder la création d'un modèle de type dynamique en django.Django: Conseils pour la conception d'un modèle avec différents champs

La structure doit décrire les données pour les produits. Il y a environ 60 différents points de données possibles qui pourraient être pertinents, chaque Produit choisissant environ 20 de ces points (avec beaucoup de chevauchement) en fonction de son ProductType. Il y a environ 2 douzaines de ProductTypes différents, chaque ProductType appartenant à l'une des 6 catégories. La méthode évidente, mais désagréable, consisterait simplement à mettre tous les 100 points de données dans le modèle de produit, et à choisir et à ignorer tous les champs laissés vides. Avantage: c'est évident. Inconvénient: c'est moche, et si j'ai besoin d'ajouter plus de points de données, cela nécessite une mise à jour de la base de données.

Ma pensée est de rendre chaque produit complètement abstrait, et de définir seulement son type de produit, et quelques autres traits d'identification.

class Product(models.Model): 
    productType = models.ForeignKey(ProductType) 

Je alors un des modèles distincts pour chaque type de point de données (nombre, texte, date, etc.), qui ressemblerait à ceci:

class TextData(models.Model): 
    fieldName = models.CharField(etc) 
    verboseName = models.CharField(etc) 
    data = models.CharField(etc) 
    product = models.ForeignKey(Product) 

Enfin, je voudrais faire un modèle Cela définit quels types de données sont pertinents pour chaque type de produit, et ce que chaque point de données doit être appelé.

class ProductType(models.Model): 
    name = models.CharField(etc) 
    .... 

La question principale est la suivante: quelle serait la meilleure façon de remplir les champs pertinents pour un type de produit, quand ils peuvent être variant? Peut-être un autre modèle qui contient le nom/type d'un point de données, et un ManyToManyField entre ProductType et ce modèle? Un champ de texte avec XML? Un champ XML extérieur définissant la structure? Abandonner toute cette poursuite et aller avec quelque chose de mieux?

Merci pour toute aide!

Répondre

2

Si vous recherchez des implémentations d'attributs dynamiques pour des modèles dans django dans une sorte de eav style, jetez un oeil à eav-django, ou au django-expando.

1

Il s'agit d'une conception de base de données relationnelle ordinaire. Ne pas trop l'optimiser avec OO et les techniques d'héritage.

Vous avez une table de catégorie de produit avec (probablement) juste des noms.

Vous avez une table de type de produit avec pas beaucoup d'informations avec FK à catégorie.

Vous avez une table de produit avec une relation FK au type de produit.

Vous disposez d'une table des caractéristiques du produit avec vos points de données et un FK pour le produit.

Pour utiliser un produit, vous interrogez le produit. Si vous avez besoin des fonctionnalités, vous travaillez simplement avec "feature_set". Django les récupère pour vous.

Ceci fonctionne remarquablement bien et est une caractéristique bien établie d'une base de données relationnelle et d'une couche ORM. La mise en cache de la base de données et la mise en cache ORM font que ces requêtes vont très rapidement.