EAV-Django

Software screenshot:
EAV-Django
Software informatie:
Versie: 1.4.4
Upload datum: 14 Apr 15
Ontwikkelaar: Andrey Mikhaylenko
Licentie: Gratis
Populariteit: 2

Rating: nan/5 (Total Votes: 0)

EAV-Django is een herbruikbare Django app die een implementatie van de Entiteit-attribuut-waarde datamodel biedt.
& Nbsp; Entity-attribuut-waarde model (EAV), ook bekend als object-attribuut-waarde model en een open schema dat wordt gebruikt in omstandigheden waarin het aantal attributen (eigenschappen, parameters) die gebruikt kunnen worden om een ​​ding te beschrijven (een " entiteit "of" object ") is potentieel zeer groot, maar het aantal dat daadwerkelijk gelden voor een bepaalde entiteit relatief bescheiden.
EAV-Django werkt prima met traditionele RDBMS (getest op SQLite en MySQL).
Prioriteiten
De applicatie groeide van een online shop project, dus het is vrij praktisch en niet alleen een academische oefening. De belangrijkste prioriteiten waren:
& Nbsp; 1. flexibiliteit van data,
& Nbsp; 2. efficiëntie van query's en
& Nbsp; 3. maximale onderhoudbaarheid zonder het bewerken van de code.
Natuurlijk betekent dit trade-offs, en het doel was om de minst schadelijke combinatie voor het algemene geval te vinden.
Kenmerken
Alle aangeboden modellen zijn abstracte, dwz EAV-Django geen informatie in zijn eigen tabellen op te slaan. In plaats daarvan biedt het een basis voor uw eigen modellen die ondersteuning voor EAV zal hebben uit de doos.
De EAV API omvat:
& Nbsp; * Maak / updaten / toegang: model gevallen bieden standart API zowel "echte" velden en EAV attributen voor. De abstractie, echter niet in de weg staan ​​en biedt middelen om te gaan met het onderliggende materiaal.
& Nbsp; * Query: BaseEntityManager omvat uniforme aanpak in de filter () en sluiten () op te vragen "echte" en EAV attributen.
& Nbsp; * Aanpasbare schema's voor de attributen.
& Nbsp; * Admin: alle dynamische attributen kunnen worden weergegeven en gewijzigd in de Django admin met geen of weinig inspanning (met behulp van eav.admin.BaseEntityAdmin). Schema's kunnen afzonderlijk worden bewerkt, als gewone Django model objecten.
& Nbsp; * Facetten: facet zoeken is een belangrijk kenmerk van online winkels, catalogi, enz. In principe krijgt u een formulier nodig die een bepaalde subset van model attributen met de juiste widgets en keuzes, zodat de gebruiker gewenste waarden van sommige eigenschappen kunnen kiezen, in te dienen de vorm en krijgen een lijst met de aanpassing van punten. Django-filter algemene geval zou doen, maar het zal niet werken met EAV, dus EAV-Django biedt een complete set van tools voor.
Voorbeelden
Laten we definiëren een EAV-vriendelijke model, maakt u een EAV attribuut en zie hoe het zich gedraagt. Met "attributen EAV" bedoel ik die zijn opgeslagen in de database als afzonderlijke objecten opgevraagd en zocht op zodanige wijze dat deze kolommen in tabel de entiteit zijn:
van django.db import modellen
van eav.models import BaseEntity, BaseSchema, BaseAttribute
klasse Fruit (BaseEntity):
& Nbsp; title = models.CharField (max_length = 50)
klasse Schema (BaseSchema):
& Nbsp; pas
klasse Attr (BaseAttribute):
& Nbsp; schema = models.ForeignKey (Schema, related_name = 'attrs')
# In Python shell:
# Definiëren attribuut genaamd "kleur"
>>> Color = Schema.objects.create (
... Title = 'Kleur',
... Name = 'kleur', # weglaten van / slugify bevolken van titel
... Datatype = Schema.TYPE_TEXT
...)
# Maak een entiteit
>>> E = Fruit.objects.create (title = 'Apple', color = "green")
# Definiëren "echte" en EAV attributen op dezelfde manier
>>> E.title
'Apple'
>>> E.colour
'Groene'
>>> E.save () # deals met EAV automatisch attributen
# Lijst EAV attributen als Attr gevallen
>>> E.attrs.all ()
[]
# Zoeken door een EAV attribuut alsof het een gewoon veld
>>> Fruit.objects.filter (color = 'geel')
[]
# Alle samengestelde lookups worden ondersteund
>>> Fruit.objects.filter (colour__contains = 'schreeuwen')
[]
Merk op dat we kunnen openen, wijzigen en query-kleur alsof het een echte Entiteit veld, maar tegelijkertijd zijn naam, type en zelfs bestaan ​​zijn volledig gedefinieerd door een Schema instantie. Een schema object kan worden opgevat als een klasse, en aanverwante Attr objecten zijn haar gevallen. Met andere woorden, schemaobjecten zijn als Charfield, IntegerField en dergelijke, alleen gedefinieerd op gegevensniveau, niet hard gecodeerd in Python. En ze kunnen worden "geconcretiseerd" voor elke entiteit (tenzij je op maat beperkingen die buiten het gebied EAV-Django's van verantwoordelijkheid zijn).
De namen van de attributen zijn gedefinieerd in gerelateerde schema's. Dit kan leiden tot de angst dat eenmaal wordt gewijzigd, verandert de code gaat breken. Eigenlijk is dit niet het geval is als de namen worden alleen direct gebruikt voor handmatige lookups. In alle andere gevallen zijn de lookups zijn gebouwd zonder hard-coded namen, en de EAV objecten zijn met elkaar verbonden door primaire sleutels, niet door namen. De namen zijn aanwezig als vormen, maar de formulieren worden gegenereerd, afhankelijk van de huidige stand van metadata, zodat je veilig de schema's kan een andere naam geven. Wat u kunt breken van de admin interface is het typen. Als u het gegevenstype van een schema te veranderen, zal al zijn attributen hetzelfde blijven, maar zal een andere kolom gebruiken om hun waarden op te slaan. Wanneer u het type gegevens te herstellen, eerder opgeslagen waarden zijn weer zichtbaar.
Zie tests voor meer voorbeelden.
Datatypes
Metadata-gedreven structuur breidt flexibiliteit, maar veronderstelt een zekere trade-offs. Een ervan wordt verhoogd aantal joins (en dus langzamer queries). Een andere is minder soorten data. Theoretisch, kunnen wij alle soorten gegevens beschikbaar zijn voor een opslag te ondersteunen, maar in de praktijk zou betekenen creëren veel kolommen per attribuut met slechts een paar wordt gebruikt - precies wat we proberen te voorkomen door het gebruik van EAV. Dit is de reden waarom EAV-Django ondersteunt alleen een aantal fundamentele typen (hoewel u deze lijst kunt uitbreiden indien nodig):
& Nbsp; * Schema.TYPE_TEXT, een tekstveld;
& Nbsp; * Schema.TYPE_FLOAT, een FloatField;
& Nbsp; * Schema.TYPE_DATE, een DateField;
& Nbsp; * Schema.TYPE_BOOL, een NullBooleanField;
& Nbsp; * Schema.TYPE_MANY voor meerdere keuzes (dwz lijsten van waarden).
Alle EAV attributen worden opgeslagen als records in een tabel met unieke combinaties van verwijzingen naar de entiteiten en schema's. (Entiteit wordt verwezen via de contenttypes kader, wordt het schema wordt verwezen via foreign key.) Met andere woorden, kan er slechts één attribuut met bepaalde entiteit en schema zijn. Het schema is een definitie van attributen. Het schema definieert naam, titel, het type gegevens en een aantal andere eigenschappen die van toepassing zijn op elke attribuut van dit schema. Wanneer we de toegang of zoek EAV attributen, de EAV machines gebruikt altijd schema als attributen metadata. Waarom? Omdat de naam van het attribuut wordt opgeslagen in verwante schema, en de waarde wordt opgeslagen in een kolom van de tabel attributen. We weten niet welke kolom het is totdat we kijken naar metadata.
In het voorbeeld hierboven hebben we gespeeld met slechts een attribuut tekst. Alle andere soorten gedragen zich precies hetzelfde, behalve voor TYPE_MANY. De veel-op-veel is een speciaal geval als het gaat om een ​​extra model voor keuzes. EAV-Django biedt een abstract model, maar vereist dat u een concreet model (bijv Keuze), en punt uit het attribuut model (dwz zet vreemde sleutel de naam "keuze") te definiëren om het. De Keuze model zal ook moeten wijzen op schema. Controleer de tests voor een voorbeeld

Wat is nieuw in deze release:.

  • Creëer / updaten / toegang: model gevallen bieden standart API voor zowel & quot; echte & quot; velden en EAV attributen. De abstractie, echter niet in de weg staan ​​en biedt middelen om te gaan met het onderliggende materiaal.
  • Query: BaseEntityManager omvat uniforme aanpak in de filter () en sluiten () op te vragen & quot; echte & quot; en EAV attributen.
  • Aanpasbare schema's voor de attributen.
  • Beheer: alle dynamische attributen kunnen worden weergegeven en gewijzigd in de Django admin met geen of weinig inspanning (met behulp van eav.admin.BaseEntityAdmin). Schema's kunnen afzonderlijk worden bewerkt, als gewone Django model objecten.
  • Facetten: facet zoeken is een belangrijk kenmerk van online winkels, catalogi, enz. In principe krijgt u een formulier die een bepaalde subset van model attributen met de juiste widgets en keuzes, zodat de gebruiker gewenste waarden van sommige eigenschappen kunnen kiezen voor nodig, in te dienen de vorm en krijgen een lijst met de aanpassing van punten. Django-filter algemene geval zou doen, maar het zal niet werken met EAV, dus EAV-Django biedt een complete set van tools voor.

Eisen

  • Python
  • Django

Andere software van ontwikkelaar Andrey Mikhaylenko

Timetra
Timetra

14 Apr 15

Monk
Monk

14 May 15

Reacties op EAV-Django

Reacties niet gevonden
Commentaar toe te voegen
Zet op de beelden!