Lors de la conception d'applications multi-tenant, il est souvent souhaitable de fournir aux utilisateurs la possibilité de définir leurs propres champs de données personnalisés . Cependant, la création et la gestion de champs dynamiques dans une base de données relationnelle peuvent s'avérer complexes. Cet article explore différentes approches pour relever ce défi dans Django.
Le package django-eav, désormais maintenu dans plusieurs forks prospères, implémente le modèle Entité-Attribut-Valeur. En stockant les attributs dynamiques dans quelques modèles Django simples, cette solution fournit :
Cependant, il souffre de performances potentielles et de maintenance problèmes.
PostgreSQL propose plusieurs types de données pour stocker des données dynamiques, notamment :
Ces champs permettent des requêtes indexées et peuvent être utilisés comme suit :
class Something(models.Model): data = JSONField(db_index=True) # JSON or JSONB something = Something.objects.create(data={'a': 1, 'b': 2}) Something.objects.filter(data__a=1)
Alternativement, Django MongoDB fournit une modélisation entièrement dynamique solution, permettant d'intégrer des documents et des listes de modèles.
from djangotoolbox.fields import DictField class Image(models.Model): exif = DictField() image = Image.objects.create(exif=get_exif_data(...))
Django-mutant propose une clé étrangère dynamique et des champs plusieurs-à-plusieurs, inspirés de l'approche de Michael Hall. Il exploite les hooks Django South pour modifier dynamiquement les schémas de base de données au moment de l'exécution, permettant ainsi des applications, des modèles et des champs Django entièrement dynamiques.
from dynamo import models test = models.DynamicModel.objects.create(name='Test') foo = models.DynamicModelField.objects.create(model=test, name='foo')
Il est important de noter les risques potentiels de stabilité et les considérations de verrouillage lors de l'utilisation de ces approches dynamiques. . Cependant, ils offrent des options puissantes pour gérer les données dynamiques dans Django.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!