EAV-Django

Logiciel capture d'écran:
EAV-Django
Détails logiciels:
Version: 1.4.4
Date de transfert: 14 Apr 15
Développeur: Andrey Mikhaylenko
Licence: Gratuit
Popularité: 2

Rating: nan/5 (Total Votes: 0)

EAV-Django Django est une application réutilisable qui fournit une implémentation du modèle de données entité-attribut-valeur.
& Nbsp; modèle Entité-Attribut-Valeur (EAV), également connu sous le modèle objet-attribut-valeur et le schéma ouvert qui est utilisé dans les cas où le nombre d'attributs (propriétés, paramètres) qui peuvent être utilisés pour décrire une chose (un " entité »ou« objet ») est potentiellement très vaste, mais le nombre qui va effectivement se appliquer à une entité donnée est relativement modeste.
EAV-Django fonctionne très bien avec SGBDR traditionnelle (testé sur SQLite et MySQL).
Priorités
La demande a augmenté d'un projet de boutique en ligne, il est donc assez pratique et pas seulement un exercice académique. Les principales priorités sont les suivantes:
& Nbsp; 1. la flexibilité des données,
& Nbsp; 2. efficacité des requêtes, et
& Nbsp; 3. maintenabilité maximale sans modifier le code.
Bien sûr, cela implique des compromis, et l'objectif était de trouver la combinaison la moins nocive pour le cas général.
Caractéristiques
Tous les modèles sont fournis abstraite, ce est-EAV-Django ne stocke pas d'informations dans ses propres tableaux. Au lieu de cela, il fournit une base pour vos propres modèles qui auront soutien EAV hors de la boîte.
L'API de EAV comprend:
& Nbsp; * Créer / mise à jour / accès: instances de modèle fournissent API standart pour les deux champs «vrais» et EAV attributs. L'abstraction, cependant, ne se arrête pas en chemin et fournit des moyens pour faire face à la substance sous-jacente.
& Nbsp; * Question: BaseEntityManager comprend approche uniforme dans le filtre () et exclure () pour interroger «réel» et EAV attributs.
& Nbsp; * schémas personnalisable pour les attributs.
& Nbsp; * Admin: tous les attributs dynamiques peuvent être représentés et modifiés dans l'administration de Django avec pas ou peu d'effort (en utilisant eav.admin.BaseEntityAdmin). Les schémas peuvent être édités séparément, comme des objets ordinaires de modèle Django.
& Nbsp; * facettes: recherche facette est une caractéristique importante de boutiques en ligne, catalogues, etc. Fondamentalement, vous aurez besoin d'une forme représentant un certain sous-ensemble les attributs des modèles avec des widgets et des choix appropriés afin que l'utilisateur peut choisir des valeurs souhaitables de certaines propriétés, présenter le formulaire et obtenir une liste des éléments correspondant. En cas général django-filtre ferait, mais il ne fonctionnera pas avec EAV, afin EAV-Django fournit un ensemble complet d'outils pour cela.
Exemples
Nous allons définir un modèle de EAV famille, créer un attribut de EAV et de voir comment il se comporte. Par "EAV attributs" Je veux dire ceux stockés dans la base de données comme des objets distincts, mais accessible et fouillé de manière comme si elles étaient des colonnes dans la table de l'entité:
à partir de modèles django.db d'importation
de eav.models BaseEntity d'importation, BaseSchema, BaseAttribute
Fruit de classe (BaseEntity):
& Nbsp; title = models.CharField (max_length = 50)
Schema classe (BaseSchema):
& Nbsp; passe
classe Attr (BaseAttribute):
& Nbsp; schema = models.ForeignKey (Schema, related_name = '' attrs)
# Coquille Python:
# Define attribut nommé "couleur"
>>> Color = Schema.objects.create (
... Title = 'Couleur',
... Name = 'color', # omettre de peupler / slugify du titre
... Type de données = Schema.TYPE_TEXT
...)
# Créer une entité
>>> E = Fruit.objects.create (title = 'Apple', color = "vert")
# Définir «réel» et EAV attributs de la même façon
>>> E.title
'Pomme'
>>> E.colour
«Verte»
>>> E.save () # traite EAV attributs automatiquement
# Liste attributs EAV comme des instances Attr
>>> E.attrs.all ()
[]
# Recherche par un attribut EAV comme si ce était un champ ordinaire
>>> Fruit.objects.filter (color = 'jaune')
[]
# Toutes les recherches de composés sont pris en charge
>>> Fruit.objects.filter (colour__contains = 'crier')
[]
Notez que nous pouvons accéder, de modifier et de la couleur de requête comme si ce était un véritable champ Entity, mais en même temps son nom, le type et même existence sommes complètement défini par une instance de schéma. Un objet de schéma peut être comprise comme une classe, et les objets liés Attr sont ses instances. En d'autres termes, les objets du schéma sont comme CharField, IntegerField et telle, que définie au niveau des données, non codée en dur dans Python. Et ils peuvent être «instanciées» pour une entité (sauf si vous mettez contraintes personnalisés qui sont en dehors de la zone de EAV-Django de responsabilité).
Les noms des attributs sont définis dans les schémas connexes. Cela peut conduire à des craintes qu'une fois qu'un nom est modifié, le code va se briser. En fait, ce ne est pas le cas que les noms ne sont directement utilisés pour les recherches manuelles. Dans tous les autres cas, les recherches sont construits sans noms codés en dur, et les objets de EAV sont reliés entre eux par des clés primaires, pas par des noms. Les noms sont présents si des formes, mais les formes sont générées selon l'état actuel de métadonnées, de sorte que vous pouvez renommer en toute sécurité les schémas. Ce que vous pouvez rompre avec l'interface d'administration est les types. Si vous changez le type d'un schéma de données, tous ses attributs restent les mêmes, mais vont utiliser une autre colonne pour stocker leurs valeurs. Lorsque vous restaurez le type de données, les valeurs précédemment stockées sont à nouveau visibles.
Voir les tests pour plus d'exemples.
Les types de données
La structure basée sur les métadonnées étend la flexibilité, mais implique des compromis. L'un d'eux est augmentation du nombre de jointures (et, par conséquent, les requêtes lentes). Une autre est moins de types de données. Théoriquement, nous pouvons soutenir tous les types disponibles pour le stockage de données, mais dans la pratique, cela signifierait la création de nombreuses colonnes par attribut avec quelques-uns étant utilisé - exactement ce que nous essayons d'éviter en utilisant EAV. Ce est pourquoi EAV-Django ne prend en charge certains types de base (si vous pouvez étendre cette liste si nécessaire):
& Nbsp; * Schema.TYPE_TEXT, un champ de texte;
& Nbsp; * Schema.TYPE_FLOAT, un FloatField;
& Nbsp; * Schema.TYPE_DATE, un DateField;
& Nbsp; * Schema.TYPE_BOOL, un NullBooleanField;
& Nbsp; * Schema.TYPE_MANY choix multiples (ie les listes de valeurs).
Tous les attributs de EAV sont stockées sous forme d'enregistrements dans un tableau avec des combinaisons uniques de références à des entités et des schémas. (Entité est référencée par le cadre de contenttypes, schéma est référencé par clé étrangère.) En d'autres termes, il ne peut y avoir qu'un seul attribut avec entité et schéma donné. Le schéma est une définition de l'attribut. Le schéma définit nom, titre, type de données et un certain nombre d'autres propriétés qui se appliquent à ne importe quel attribut de ce schéma. Lorsque nous accédons ou attributs de recherche EAV, la machinerie de EAV utilise toujours schémas comme des attributs de métadonnées. Pourquoi? Parce que le nom de l'attribut est stocké dans le schéma connexe, et la valeur est stockée dans une colonne de la table d'attributs. Nous ne savons pas quelle colonne il est jusqu'à ce que nous regardons métadonnées.
Dans l'exemple fourni ci-dessus, nous avons seulement joué avec un attribut de texte. Tous les autres types se comportent exactement de la même sauf pour TYPE_MANY. Le many-to-many est un cas particulier car il se agit d'un modèle supplémentaire pour choix. EAV-Django fournit un modèle abstrait, mais vous oblige à définir un modèle concret (par exemple le choix), et le point à partir du modèle d'attribut (de clé étrangère à-dire mettre nommée «choix»). Le modèle de choix devra également pointer au schéma. Vérifiez les essais pour un exemple

Quoi de neuf dans cette version:.

  • Créer / mise à jour / accès: instances de modèle fournissent API standart pour les & quot; vraie & quot; les champs et les attributs de EAV. L'abstraction, cependant, ne se arrête pas en chemin et fournit des moyens pour faire face à la substance sous-jacente.
  • Requête: BaseEntityManager comprend approche uniforme dans le filtre () et exclure () pour interroger & quot; vraie & quot; et EAV attributs.
  • schémas personnalisable pour les attributs.
  • Admin: tous les attributs dynamiques peuvent être représentés et modifiés dans l'administration de Django avec pas ou peu d'effort (en utilisant eav.admin.BaseEntityAdmin). Schémas peut être édité séparément, comme des objets ordinaires de modèle Django.
  • facettes: recherche facette est une caractéristique importante de boutiques en ligne, catalogues, etc. Fondamentalement, vous aurez besoin d'une forme représentant un certain sous-ensemble de modèle attributs avec des widgets et des choix appropriés de telle sorte que l'utilisateur peut choisir les valeurs de certaines propriétés souhaitables, présenter le formulaire et obtenir une liste des éléments correspondant. En cas général django-filtre ferait, mais il ne fonctionnera pas avec EAV, afin EAV-Django fournit un ensemble complet d'outils pour cela.

Exigences :

  • Python
  • Django

D'autres logiciels de développeur Andrey Mikhaylenko

Monk
Monk

14 May 15

Timetra
Timetra

14 Apr 15

Commentaires à EAV-Django

Commentaires non trouvées
Ajouter un commentaire
Tourner sur les images!