svfat
@svfat
☺Нужен VPS? Два месяца бесплатно. Смотри профиль☺

Объекты с динамически создаваемыми свойствами в Django?

Надо реализовать возможность добавления пользователями дополнительных свойств к имеющимся объектам (длина, ширина, вес, интерфейс, цвет - все что угодно) Какими эти свойства будут, сколько их будет всего и что они будут содержать в качестве значений - не известно. Думаю реализовать тремя моделями, примерно так:
class Item(models.Model):
    name = models.CharField(max_length=100)

class Property(models.Model):
    name = models.CharField(max_length=100)

class ItemProperties(models.Model):
    item = models.ForeignKey(Item)
    property = models.ForeignKey(Property)
    value = models.CharField(max_length=100)


Нормально это? Или есть более удобные(готовые) решения? Не очень представляю, как затем работать с value - если там могут содержаться самые разнообразные данные - числа, строки, геокоординаты - может ввести еще PropertyType для определения типа свойства?
  • Вопрос задан
  • 631 просмотр
Решения вопроса 2
un1t
@un1t
Ваша идея уже релизована https://github.com/mvpdev/django-eav
Другая идея использовать для фасетов полнотекстовые движки Elasicsearch или Sphinx.
Ответ написан
Комментировать
собственно как предложили выше django-eav (или eav-django)
при использовании постгре можно попробовать это: djbook.ru/rel1.8/ref/contrib/postgres/fields.html#...

либо использовать несколько иной подход, каждый ТИП параметра хранить в отдельной табличке.
и связывать объект с параметрами через GenericForeignKey djbook.ru/rel1.8/ref/contrib/contenttypes.html#gen... одно поле внешний ключ на специальную таблицу(описывающую все модели в проекте), второе id в той таблице.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@m0ody
backend dev (python, django, postgresql, celery)
Помимо предложенного HStoreField есть еще JSONField. Это на тот случай, если value может быть не только строкой, но и числом, bool, None. Это поле пока только в мастер ветке (https://github.com/django/django/blob/master/djang...). Ожидается в django 1.9.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы