Джанго - проектирование моделей с виртуальными полями? - PullRequest
3 голосов
/ 26 февраля 2009

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

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

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

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

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

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

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

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

ТИА.

Ответы [ 4 ]

13 голосов
/ 26 февраля 2009

Продукты имеют особенности.

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()

Если вы хотите, вы можете иметь основной список имен объектов в отдельной таблице. Не переоценивайте особенности. Вы не можете обрабатывать их. Все, что вы делаете, это дарите их.

3 голосов
/ 26 февраля 2009

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

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

2 голосов
/ 26 февраля 2009

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

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

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

0 голосов
/ 27 февраля 2009

Иди с наследством. Создать Производите подклассы со своими собственными, дополнительными полями.

...