2016-04-29 4 views
3

Мне нужно реализовать довольно стандартную иерархию сущностей-атрибутов. Существуют устройства нескольких типов, каждый тип имеет множество настроек, которые он может иметь, каждое отдельное устройство имеет набор конкретных значений для каждого параметра. Похоже, что пакеты django-eav и eav-django больше не поддерживаются, поэтому, я думаю, мне нужно сворачивать самостоятельно. Но как мне это сделать? До сих пор я думаю о чем-то подобном (пропуская много деталей)Как реализовать EAV в Django

 
class DeviceType(Model): 
    name = CharField() 

class Device(Model): 
    name = CharField() 
    type = ForeignKey(DeviceType) 

class Setting(Model): 
    name = CharField() 
    type = CharField(choices=(('Number', 'int'), ('String', 'str'), ('Boolean', 'bool'))) 
    device_type = ForeignKey(DeviceType) 

class Value(Model): 
    device = ForeignKey(Device) 
    setting = ForeignKey(Setting) 
    value = CharField() 

    def __setattr__(self, name, value): 
     if name == 'value': 
      ... do validation based on the setting type ... 

    def __getattr__(self, name): 
     if name == 'value': 
      ... convert string to whatever is the correct value for the type ... 

Я что-то пропустил? Есть ли лучший способ сделать это? Будет ли это работать?

ответ

-1

Я пытаюсь ответить, дайте мне знать, потому что мы находимся на одном самолете. Я думаю, вам нужно сначала сформулировать базу данных базы данных EAV. Для этого определите, каковы сущности, атрибуты и связанные значения. Здесь, в примере, указанном вами, возможно, устройство может быть устройством и его атрибутом. Если мы возьмем другой пример, скажем, в случае продажи автомобилей, компания будет реквизитом продаж, атрибут - это продукт, приобретенный клиентом (автомобиль), а значения - цена, модель автомобиля, цвет автомобиля и т. Д. Сделать мастер-таблицы и таблицы, в которых хранятся сопоставления если таковые имеются. Эта реализация схемы в models.py будет создавать ваши модели и вставлять значения в эти модели через оболочку или вставлять скрипт.

+2

Во-первых, вы можете заметить, что этот вопрос был задан в апреле. С тех пор я внедрил версию кода, опубликованную в вопросе. Это работает достаточно хорошо для меня, хотя я предпочел бы иметь более удобное решение. Во-вторых, ваш ответ очень общий. Вы даже знаете Джанго? –

+0

Вы случайно использовали django-eav? Фильтрация для меня совсем не работает. – iMitwe

+0

@iMitwe no, когда я искал этот ответ, django-eav был в значительной степени мертв в воде, поэтому я просмотрел ограниченную версию, основанную на коде выше. –

Смежные вопросы