EAV-Django

Скріншот програми:
EAV-Django
Дані програми:
Версія: 1.4.4
Дата завантаження: 14 Apr 15
Розробник: Andrey Mikhaylenko
Ліцензія: Безкоштовно
Популярність: 2

Rating: nan/5 (Total Votes: 0)

EAV-Django є багаторазовим Django додаток, що забезпечує реалізацію моделі даних Entity-атрибут-значення.
І NBSP; Модель сутність-атрибут-значення (EAV), також відомий як об'єкт-атрибут-значення моделі та відкрита схема, яка використовується в тих випадках, коли кількість атрибутів (властивостей, параметрів), які можуть бути використані для опису річ (" особа "або" об'єкт ") є потенційно дуже обширна, але номер, який буде насправді відносяться до даного об'єкта відносно невеликий.
EAV-Django відмінно працює з традиційною СУБД (перевірено на SQLite і MySQL).
Пріоритети
Додаток виріс в інтернет-проекту магазину, так що це досить практично і не тільки академічний вправу. Основними пріоритетами були:
І NBSP; 1. Гнучкість даних,
І NBSP; 2. Ефективність запитів, і
І NBSP; 3. Максимальна експлуатаційна без редагування коду.
Звичайно, це означає, компроміси, і метою було знайти найменш шкідливі комбінацію для загального випадку.
Особливості
Всі представлені моделі є абстрактними, тобто EAV-Django не зберігає інформацію у своєму власному таблиць. Замість цього, вона забезпечує основу для ваших власних моделей, які матимуть підтримку EAV з коробки.
EAV API включає в себе:
І NBSP; * Створення / оновлення / доступ: випадки модель забезпечує стандартну API для обох «реальними» полями і атрибути EAV. Абстракція, однак, не стояти на вашому шляху і забезпечує засоби для боротьби з основного матеріалу.
І NBSP; * Запит: BaseEntityManager включає в себе єдиний підхід у фільтрі () і виключити () для отримання "реальна" і атрибути EAV.
І NBSP; * власні схеми для ознак.
І NBSP; * Admin: всі динамічні ознаки можуть бути представлені і не буде змінена адміністратором Django з відсутністю або невеликим зусиллям (за допомогою eav.admin.BaseEntityAdmin). Schemata можна редагувати окремо, як звичайні Django моделі об'єктів.
І NBSP; * Грані: пошук грань є важливою особливістю інтернет-магазинів, каталогів і т.д. Загалом, ви будете мати потребу в форму, що представляє деяку підмножину моделі атрибути з відповідними віджетами і виборами так, що користувач може вибрати бажані значення деяких властивостей, представити форма і отримати список відповідних елементів. У загальному випадку Django-фільтр буде робити, але це не буде працювати з EAV, так EAV-Django надає повний набір інструментів для цього.
Приклади
Давайте визначимо модель EAV чисті, створити атрибут EAV і подивитися, як він поводиться. По "атрибути EAV" Я маю на увазі тих, які зберігаються в базі даних як окремі об'єкти, але доступ і пошук таким чином, як якщо б вони були стовпців в таблиці юридичної особи:
від django.db імпортних моделей
від eav.models імпорту BaseEntity, BaseSchema, BaseAttribute
клас Fruit (BaseEntity):
І NBSP; назва = models.CharField (max_length = 50)
схеми класу (BaseSchema):
І NBSP; передача
клас атр (BaseAttribute):
І NBSP; схеми = models.ForeignKey (схема, related_name = 'ATTRS ")
# У шкаралупі Python:
# Визначаємо атрибут з ім'ям "Колір"
>>> Колір = Schema.objects.create (
... Назва = "Колір",
... Ім'я = 'колір', # Пропустити для заповнення / slugify з назви
... Тип даних = Schema.TYPE_TEXT
...)
# Створюємо об'єкт
>>> Е = Fruit.objects.create (назва = «Яблуко», колір = "зелений")
# Визначити "реальний" і EAV атрибути точно так само,
>>> E.title
'Яблуко'
>>> E.colour
'Зелений'
>>> E.save () # угод з EAV атрибути автоматично
# Список атрибутів EAV як екземпляри ATTR
>>> E.attrs.all ()
[<Атт: Apple: Колір "зелений">]
# Пошук по атрибуту EAV, як якщо б це був звичайний поле
>>> Fruit.objects.filter (колір = «жовтий»)
[<Фрукти: Apple>]
# Всі складові пошуки підтримуються
>>> Fruit.objects.filter (colour__contains = 'кричати')
[<Фрукти: Apple>]
Зверніть увагу, що ми можемо отримати доступ, змінювати і колір запит, як якби це було правдою поле Entity, але в той же час його ім'я, тип і навіть Існування повністю визначаються примірника схеми. Схеми об'єкта може бути зрозуміла як клас, та об'єктів, пов'язаних з Attr є його екземпляри. Іншими словами, об'єкти схеми схожі CharField, IntegerField й такі, визначений тільки на рівні даних, а не жорстко в Python. І вони можуть бути "екземпляр" для будь-якої особи (якщо ви не поставити власні обмеження, які знаходяться за межами області EAV-Джанго відповідальності).
Імена атрибутів визначені у відповідних схем. Це може призвести до побоювання, що колись ім'я змінилося, код буде перерва. Насправді це не так, оскільки імена тільки безпосередньо використовуються для ручних пошуків. У всіх інших випадках пошуки побудовані без жорстко заданих імен, і об'єкти EAV пов'язані між собою первинних ключів, а не по іменах. Імена присутні, якщо форми, але форми створюються в залежності від поточного стану метаданих, так що ви можете спокійно перейменувати схем. Що ви можете вирватися з інтерфейсу адміністратора визначити види. Якщо ви зміните тип даних схеми, всі його атрибути залишиться такою ж, але буде використовувати ще один стовпець для зберігання своїх цінностей. При відновленні тип даних, раніше збережені значення можуть бачити знову.
См тести для більшої кількості прикладів.
Типи даних
На основі метаданих; структура простягається гнучкість, але має на увазі деякі компроміси. Один з них збільшується число об'єднань (і, отже, більш повільні запити). Інший менше типів даних. Теоретично, ми можемо підтримати всі типи даних, доступні для зберігання, але на практиці це означатиме, створюючи багато колонок в атрибуті тільки з дещо використовується - саме те, що ми намагалися уникнути за допомогою EAV. Ось чому EAV-Django тільки підтримує деякі основні типи (хоча ви можете розширити цей список при необхідності):
І NBSP; * Schema.TYPE_TEXT, TextField;
І NBSP; * Schema.TYPE_FLOAT, FloatField;
І NBSP; * Schema.TYPE_DATE, DateField;
І NBSP; * Schema.TYPE_BOOL, NullBooleanField;
І NBSP; * Schema.TYPE_MANY для декількох варіантів (тобто списки значень).
Усі атрибути EAV зберігаються у вигляді записів в таблиці з унікальними комбінаціями посилань на осіб та схем. (Entity посилається через рамки ContentTypes, схема посилаються через зовнішній ключ.) Іншими словами, може бути тільки один атрибут з даного суб'єкта і схеми. Схема є визначення атрибута. Схема визначає назву, назву, тип даних і ряд інших властивостей, які застосовуються до будь-якого атрибуту цієї схеми. Коли ми отримуємо доступ або шукати атрибути EAV, EAV техніка завжди використовує схем в якості атрибутів метаданих. Чому? Оскільки ім'я атрибута зберігається у відповідній схемі, і значення зберігається в колонці таблиці атрибутів. Ми не знаємо, який стовпець це, поки ми не подивимося на метаданих.
У наведеному вище прикладі ми грали тільки за допомогою текстового атрибута. Всі інші типи поводяться точно так же для TYPE_MANY винятком. Багато-до-багатьох це особливий випадок, оскільки це передбачає додаткове модель для вибору. EAV-Django надає абстрактну модель, але вимагає, щоб визначити конкретну модель (наприклад, вибір), і вказати на нього в моделі атрибута (тобто покласти зовнішнього ключа з ім'ям "вибір"). Вибір моделі також доведеться вказати на схемі. Перевірте тести на приклад

Що нового У цьому випуску :.

  • Створити / оновлення / доступ: випадки модель забезпечує Стандарт API як для & Quot; реальний і Quot; поля і атрибути EAV. Абстракція, однак, не стояти на вашому шляху і забезпечує засоби для боротьби з основного матеріалу.
  • Запит: BaseEntityManager включає в себе єдиний підхід у фільтрі () і виключити () для отримання і Quot; реальний і Quot; і атрибути EAV.
  • власні схеми для ознак.
  • Admin: всі динамічні ознаки можуть бути представлені і не буде змінена адміністратором Django з відсутністю або невеликим зусиллям (за допомогою eav.admin.BaseEntityAdmin). Schemata можна редагувати окремо, як звичайні Django моделі об'єктів.
  • Грані: пошук грань є важливою особливістю інтернет-магазинів, каталогів і т.д. Загалом, ви будете мати потребу в форму, що представляє деяку підмножину моделі атрибути з відповідними віджетами і вибори так, щоб користувач може вибрати бажані значення деяких властивостей, представити форма і отримати список відповідних елементів. У загальному випадку Django-фільтр буде робити, але це не буде працювати з EAV, так EAV-Django надає повний набір інструментів для цього.

Вимоги

  • Python
  • Django

Інші програми розробника Andrey Mikhaylenko

Monk
Monk

14 May 15

Timetra
Timetra

14 Apr 15

EAV-Django

Коментар не знайдено
додати коментар
Включіть картинки!