Django - создание моделей с виртуальными полями?

Я хотел бы спросить о самом элегантном подходе к разработке моделей с виртуальными полями, например, как показано ниже в Django ...

Допустим, мы создаем интернет-магазин, и все продукты в системе определяются моделью Продукт ».

class Product(models.Model):
    # common fields that all products share
    name = ...
    brand = ...
    price = ...    

Но в магазине будет много типов продуктов, совершенно не связанных друг с другом, поэтому мне нужен какой-то способ хранить эти виртуальные поля с разными типами продуктов (например, емкость MP3-плеера, количество страниц книги и т. Д.).

Решения, которые я мог бы придумать с помощью моих сырых навыков Django, пока далеки от совершенства:

  • Имея свойство custom_fields и промежуточные таблицы, которыми я управляю вручную. (кричит мне в лицо :))

  • Или наследование классов от Product » на лету с помощью опасных операторов Python exec-eval (это слишком много магии вуду для обслуживания, а также для реализации потребуется знание внутреннего устройства Django).

Что ты думаешь об этом?

TIA.

Ответов (4)

Решение

У продуктов есть особенности.

class Feature( models.Model ):
    feature_name = models.CharField( max_length=128 )
    feature_value = models.TextField()
    part_of = models.ForeignKey( Product )

Как это.

Просто список возможностей.

p= Product( "iPhone", "Apple", 350 )
p.save()
f= Feature( "mp3 capacity", "16Gb", p )
f.save()

При желании вы можете иметь общий список имен функций в отдельной таблице. Не переоценивайте особенности. Вы не можете обрабатывать их. Все, что вы делаете, - это их представляете.

Ruby on Rails имеет «сериализованное» поле, которое позволяет вам упаковать словарь в текстовое поле. Может быть, DJango предлагает нечто подобное?

В этой статье есть реализация SerializedDataField.

Лично я бы согласился с ответом С. Лотта. Однако вы можете создать собственное поле JSON:

http://svn.navi.cx/misc/trunk/djblets/djblets/util/fields.py

http://www.djangosnippets.org/snippets/377/

Пойдите с наследством. Создайте подклассы Produce с их собственными дополнительными полями.