Джанго: Советы по разработке модели с различными полями - PullRequest
1 голос
/ 31 августа 2010

Я ищу несколько советов / мнений о том, как лучше всего создать динамическую модель в django.

Структура должна описывать данные для Продуктов.Существует около 60 различных возможных точек данных, которые могут быть релевантными, причем каждый Продукт выбирает около 20 из этих точек (с большим перекрытием) в зависимости от его ProductType.Существует около 2 дюжин различных типов продуктов, каждый из которых относится к одной из 6 категорий.

Очевидный, но неблагодарный метод - просто поместить все 100 точек данных в модель продукта и просто выбрать и выбратьи игнорируйте все поля, оставленные пустыми.Преимущество: это очевидно.Недостаток: это некрасиво, и если мне нужно добавить больше точек данных, это требует обновления базы данных.

Моя мысль состоит в том, чтобы сделать каждый продукт полностью абстрактным и определить только его тип продукта, а также несколько других идентификаторов.traits.

class Product(models.Model):
    productType = models.ForeignKey(ProductType)

Я бы тогда имел отдельные модели для каждого типа точек данных (число, текст, дата и т. д.), которые выглядели бы так:

class TextData(models.Model):
    fieldName = models.CharField(etc)
    verboseName = models.CharField(etc)
    data = models.CharField(etc)
    product = models.ForeignKey(Product)

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

class ProductType(models.Model):
    name = models.CharField(etc)
    ....

Итак, главный вопрос: что будет лучшим способом?заполнить соответствующие поля для типа продукта, когда они могут варьироваться?Возможно, другая модель, которая содержит имя / тип точки данных, и ManyToManyField между ProductType и этой моделью?Текстовое поле с XML?Внешнее поле XML, определяющее структуру?Оставить все это занятие и пойти с чем-то лучше?

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Если вы ищете реализации динамических атрибутов для моделей в django в каком-то виде eav стиль , взгляните на eav-django или django- Expando .

1 голос
/ 31 августа 2010

Это обычный дизайн реляционной базы данных.Не переусердствуйте с OO и методами наследования.

У вас есть таблица категорий продуктов с (возможно) только именами.

У вас есть таблица типов продуктов с небольшим количеством информации от FK до категории.

У вас есть продукттаблица с отношением FK к типу продукта.

У вас есть таблица характеристик продукта с указанием точек данных и FK к продукту.

Для работы с продуктом вы запрашиваете продукт.Если вам нужны функции, вы просто работаете с «feature_set».Django выбирает их для вас.

Это работает замечательно хорошо и является хорошо зарекомендовавшей себя особенностью реляционной базы данных и слоя ORM.Кэширование БД и ORM делает эти запросы очень быстрыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...