Прежде всего, я очень новичок в Python/Django, но я использую другие технологии в течение многих лет.Наследование на Python или дополнительные свойства для огранки
В веб-сайт, где пользователи могут создавать публикации (давайте думать о Amazon, например), у меня есть Publication
объект, который содержит основные вещи, такие как заголовок, детали, цена и т.д.
Я хочу, однако , чтобы включить определенные свойства, характерные для типа объекта (ткань имела бы размер, цвет, для мужчин/для женщин, автомобили имели бы бренд, модель, двигатель, трансмиссия и т. д.). Идея состоит в том, чтобы использовать Haystack/Elasticsearch для того, чтобы делать огранку на этих свойствах, в зависимости от того, что ищет пользователь.
Итак, вот базовая модель:
# main publication class
class Publication(models.Model):
OBJECT_TYPE = (
('cloth', 'Cloth'),
('electronics', 'Electronics'),
('car', 'Cars'),
)
object_type = models.CharField(max_length=30,
choices=OBJECT_TYPE,
default='electronics')
title = models.CharField()
details = models.CharField()
# other fields...
# Haystack index
class PublicationIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
object_type = indexes.CharField(faceted=True, model_attr='object_type')
# other fields...
Вопрос заключается в том, где я должен хранить эти другие свойства?
Одним из вариантов было бы иметь другой класс/модель с деталями и FK для публикации. Если да, то как мне тогда построить индекс? Другим вариантом было бы поставить все свойства для всех публикаций в модели Publication
, что было бы самым простым, но, вероятно, не изящным.
Другим вариантом было бы наследование, чтобы иметь CarPublication
, ClothPublication
и т. Д. Если это так, будет вопрос, как мне обрабатывать основные вещи, чтобы избежать дублирования всех экранов по одному для каждого типа публикации.
У меня будет только 3 типа публикаций, и я не думаю, что добавлю больше, так что наследование, например, является выполнимым вариантом (у Amazon есть сотни категорий, поэтому они разные).
Какой был бы лучший подход?
FYI, используя Python 3, Django 1.9, Haystack 2.5-dev, Elasticsearch.
[Джанго полиморфный] (https://github.com/chrisglass/django_polymorphic) обрабатывает это красиво –
спасибо @IanPrice. Выглядит неплохо. Не стесняйтесь публиковать его в качестве ответа. –