2009-02-26 4 views
2

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

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

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

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

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

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

  • Или наследуя классы от «продукт» на лету с опасных EXEC-Eval заявления Питона (то есть слишком много вуду магии для поддержания , а также реализации потребует знания о внутренних компонентах Django).

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

TIA.

ответ

13

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

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

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

+1

Абстрактная модель с общими полями также является полезным способом справиться с этим. –

3

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

This article имеет реализацию SerializedDataField.

0

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