EAV-Django

Screenshot Software:
EAV-Django
Mga detalye ng Software:
Bersyon: 1.4.4
I-upload ang petsa: 14 Apr 15
Nag-develop: Andrey Mikhaylenko
Lisensya: Libre
Katanyagan: 2

Rating: nan/5 (Total Votes: 0)

EAV-Django ay isang magagamit muli Django app na nagbibigay ng pagpapatupad ng modelo ng data Entity-Attribute-Halaga.
& Nbsp; Entity-Attribute-Halaga ng modelo (EAV), na kilala rin bilang mga object-attribute value modelo at bukas ang scheme na ginagamit sa mga pangyayari na kung saan ang bilang ng mga katangian (katangian, mga parameter) na maaaring gamitin upang ilarawan ang isang bagay (isang " entity "o" object ") ay potensyal na napaka malawak, ngunit ang bilang na iyon ay aktwal na nalalapat sa isang naibigay na entity ay relatibong katamtaman.
EAV-Django gumagana multa na may tradisyonal na RDBMS (nasubok sa SQLite at MySQL).
Mga priyoridad
Lumago ang application mula sa isang online na proyekto shop, kaya ito ay medyo praktikal at hindi lamang isang akademikong ehersisyo. Ang pangunahing mga priority ay:
& Nbsp; 1. kakayahang umangkop ng data,
& Nbsp; 2. kahusayan ng query, at
& Nbsp; 3. maximum na maintainability nang walang pag-edit ng code.
Siyempre ito ay nagpapahiwatig ng trade-off, at ang layunin ay upang mahanap ang hindi bababa sa mapanganib na mga kumbinasyon para sa pangkalahatang kaso.
Mga Tampok
Ang lahat ng ibinigay na mga modelo ay abstract, ibig sabihin, EAV-Django hindi nag-iimbak ng anumang impormasyon sa sarili nitong table. Sa halip, ito ay nagbibigay ng isang batayan para sa iyong sariling mga modelo na may suporta para sa EAV-agad.
Ang EAV API ay kabilang ang:
& Nbsp; * Lumikha / mag-update / access ang: paglitaw ng modelo magbigay standart API para sa mga patlang ng parehong mga "real" at EAV mga katangian. Ang abstraction, gayunpaman, ay hindi tumayo sa iyong paraan at nagbibigay ng paraan upang harapin ang kalakip na mga bagay-bagay.
& Nbsp; * Query: BaseEntityManager Kasama pare-parehong diskarte sa filter () at ibukod ang () upang i-query ang "real" at EAV mga katangian.
& Nbsp; * Nako-customize na schemata para sa mga katangian.
& Nbsp; * Admin: lahat ng dynamic na mga katangian maaaring katawanin at nabago sa Django admin na walang o maliit na pagsisikap (gamit eav.admin.BaseEntityAdmin). Maaaring i-edit nang hiwalay Schemata, bilang ordinaryong mga bagay modelo Django.
& Nbsp; * Facet: facet paghahanap ay isang mahalagang tampok ng online na tindahan, katalogo, atbp talaga kakailanganin mo ng paraan na kumakatawan sa isang tiyak na subset ng mga modelo ng mga katangian na may naaangkop na mga widget at mga pagpipilian sa gayon ay maaaring magpasya ang kanais-nais na halaga ng ilang mga pag-aari, isumite ang form at makakuha ng listahan ng mga tumutugmang item. Sa Django-filter pangkalahatang kaso gagawin, ngunit hindi ito gagana sa EAV, kaya EAV-Django ay nagbibigay ng isang kumpletong hanay ng mga tool para doon.
Mga halimbawa
Tukuyin ang isang EAV-friendly modelo, lumikha ng isang EAV katangian at makita kung paano ito behaves Hayaan. Sa pamamagitan ng "EAV katangian" Ibig kong sabihin mga naka-imbak sa database bilang hiwalay na mga bagay ngunit-access at naghanap sa paraan na parang sila ay mga haligi sa talahanayan ng entity:
mula django.db pag-import ng mga modelo
mula eav.models BaseEntity-import, BaseSchema, BaseAttribute
klase Prutas (BaseEntity):
& Nbsp; title = models.CharField (MAX_LENGTH = 50)
klase Schema (BaseSchema):
& Nbsp; pass
klase Attr (BaseAttribute):
& Nbsp; schema = models.ForeignKey (Schema, related_name = 'attrs')
# Sa Python shell:
# Tutukuyin sa katangian na may pangalang "color"
>>> Kulay = Schema.objects.create (
... Title = 'Kulay',
... Pangalan = 'kulay', # ligtaan upang tirhan / slugify mula sa pamagat
... Datatype = Schema.TYPE_TEXT
...)
# Lumikha ng isang entity
>>> E = Fruit.objects.create (title = 'Apple', kulay = 'berde')
# Tukuyin ang "real" at EAV mga katangian sa parehong paraan
>>> E.title
'Apple'
>>> E.colour
'Berde'
>>> E.save () # deal sa EAV awtomatikong katangian
# Listahan EAV mga katangian tulad ng paglitaw ng Attr
>>> E.attrs.all ()
[]
# Ng paghahanap sa pamamagitan ng EAV katangian na parang ito ay isang ordinaryong field
>>> Fruit.objects.filter (kulay = 'dilaw')
[]
# Lahat ng tambalang lookup ay suportado
>>> Fruit.objects.filter (colour__contains = 'sumigaw')
[]
Tandaan na maaari naming ma-access, baguhin at kulay query na parang ito ay isang tunay na field Entity, ngunit sa parehong panahon nitong pangalan, uri at kahit existance ay ganap na tinukoy sa pamamagitan ng isang Schema halimbawa. Maintindihan ang Schema na bagay bilang isang klase, at mga kaugnay na mga bagay Attr ang mga pagkakataon nito. Sa ibang salita, Schema bagay ay tulad ng CharField, IntegerField at tulad, na tinukoy lamang sa antas ng data, hindi hard-code sa Python. At sila ay maaaring "instantiated" para sa anumang Entity (maliban kung inilagay mo ang custom na mga hadlang na nasa labas ng lugar EAV-Django ng mga responsibilidad).
Ang mga pangalan ng katangian ay tinukoy sa mga kaugnay na schemata. Ito ay maaaring humantong sa takot na kapag ang isang pangalan ay nagbago, ang code ay pagpunta sa masira. Sa totoo lang hindi ito ang kaso ng mga pangalan ay direktang lamang na ginagamit para sa manu-manong lookup. Sa lahat ng iba pang mga kaso ng lookup ay binuo nang walang hard-code na pangalan, at ang EAV bagay ay interlinked sa pamamagitan ng pangunahing mga key, hindi ng pangalan. Ang mga pangalan ay naroroon kung ang mga form, ngunit ang mga form ay nabuo depende sa kasalukuyang estado ng metadata, kaya maaari mong ligtas na palitan ang pangalan ng schemata. Ano ang maaari mong buksan mula sa interface ng admin ay ang mga uri. Kung babaguhin mo ang uri ng data ng schema, ang lahat ng mga katangian nito ay mananatiling pareho ngunit gagamitin ng isa pang hanay upang maiimbak ang kanilang mga halaga. Kapag ibalik mo ang uri ng data, dating naka-imbak na mga halaga ay makikita muli.
Tingnan ang mga pagsubok para sa higit pang mga halimbawa.
Uri ng data
Istraktura ng metadata-driven na umaabot kakayahang umangkop ngunit nagpapahiwatig ng ilang mga trade-off. Ang isa sa mga ito ay ang pagtaas ng bilang ng mga miyembro ay sumali (at, samakatuwid, mas mabagal mga tanong). Ang isa pang ay mas kaunting mga uri ng data. Theoretically, maaari naming sinusuportahan ng lahat ng mga uri ng data na magagamit para sa isang imbakan, ngunit sa kasanayan ay nangangahulugan ng paglikha ng maraming mga hanay sa bawat katangian sa ilang ginagamit - eksaktong kung ano tayo ay sinusubukan upang maiwasan sa pamamagitan ng paggamit EAV. Ito ang dahilan kung bakit sumusuporta lamang EAV-Django ilang mga pangunahing uri (bagaman maaari mong pahabain ang listahang ito kung kinakailangan):
& Nbsp; * Schema.TYPE_TEXT, isang textfield;
& Nbsp; * Schema.TYPE_FLOAT, isang FloatField;
& Nbsp; * Schema.TYPE_DATE, isang DateField;
& Nbsp; * Schema.TYPE_BOOL, isang NullBooleanField;
& Nbsp; * Schema.TYPE_MANY para sa maramihang mga pagpipilian (ibig sabihin, mga listahan ng mga values).
Ang lahat ng mga katangian EAV ay naka-imbak bilang mga record sa isang talahanayan na may mga natatanging kumbinasyon ng mga sanggunian sa mga entity at schemata. (Entity ay na-reference sa pamamagitan ng contenttypes framework, schema ay na-reference sa pamamagitan ng mga banyagang key.) Sa ibang salita, mayroong maaaring maging lamang sa isang katangian na may ibinigay na entity at schema. Schema ay isang kahulugan ng katangian. Schema ang tumutukoy sa pangalan, pamagat, uri ng data at isang bilang ng iba pang mga katangian na nalalapat sa anumang katangian ng schema na ito. Kapag na-access namin o maghanap ng mga katangian EAV, ang EAV makinarya palaging gumagamit ng schemata bilang mga katangian ng metadata. Bakit? Dahil ang pangalan ng attribute ay naka-imbak sa mga kaugnay na schema, at ang mga halaga ay naka-imbak sa isang hanay ng talahanayan katangian. Hindi namin alam kung saan haligi ito ay hanggang tinitingnan namin ang metadata.
Sa halimbawa na binigay sa itaas lamang namin nilaro na may katangian ng teksto. Kumilos nang eksakto ang lahat ng iba pang mga uri ng parehong maliban para sa TYPE_MANY. Ang maraming-to-maraming ay isang espesyal na kaso bilang nagsasangkot ito ng dagdag na modelo para sa mga pagpipilian. EAV-Django ay nagbibigay ng isang abstract modelo ngunit nangangailangan ng sa iyo upang tukuyin ang isang kongkreto modelo (eg Choice), at punto upang ito mula sa modelo ng katangian (ibig sabihin, ilagay ang mga banyagang susi na pinangalanang "pagpipilian"). Ang modelong Choice ay magkakaroon din ng upang tumuro sa Schema. Lagyan ng check ang mga pagsubok para sa isang halimbawa

Ano ang bagong sa paglabas:. Magbigay ng mga pagkakataon ng modelo:

  • Gumawa / mag-update / pag-access standart API para sa parehong & quot; tunay & quot; mga patlang at katangian EAV. Ang abstraction, gayunpaman, ay hindi tumayo sa iyong paraan at nagbibigay ng paraan upang harapin ang kalakip na mga bagay-bagay.
  • Query: BaseEntityManager Kasama pare-parehong diskarte sa filter () at ibukod () para sa mga tanong na & quot; tunay & quot; at EAV mga katangian.
  • Nako-customize na schemata para sa mga katangian.
  • Admin: lahat ng dynamic na mga katangian maaaring katawanin at nabago sa Django admin na walang o maliit na pagsisikap (gamit eav.admin.BaseEntityAdmin). Maaaring i-edit nang hiwalay Schemata, bilang ordinaryong mga bagay modelo Django.
  • Mga Facet: facet paghahanap ay isang mahalagang tampok ng online na tindahan, katalogo, atbp talaga kakailanganin mo ng paraan na kumakatawan sa isang tiyak na subset ng mga modelo ng mga katangian na may naaangkop na mga widget at mga pagpipilian sa gayon ay maaaring magpasya ang kanais-nais na halaga ng ilang mga pag-aari, isumite ang form at makakuha ng listahan ng mga tumutugmang item. Sa Django-filter pangkalahatang kaso gagawin, ngunit hindi ito gagana sa EAV, kaya EAV-Django ay nagbibigay ng isang kumpletong hanay ng mga tool para doon.

Mga Kinakailangan :

  • Python
  • Django

Iba pang mga software developer ng Andrey Mikhaylenko

Timetra
Timetra

14 Apr 15

Monk
Monk

14 May 15

Mga komento sa EAV-Django

Mga Komento hindi natagpuan
Magdagdag ng komento
I-sa mga imahe!