Как реализовать фильтры товаров django?

Подскажите,как реализовать фильтры товаров?
У товаров может быть множество свойств (например,Вид масла - гидравлическое), у каждого товара - свой набор свойств.
Можно сделать по примеру lfs, но забивать руками очень долго.
спасибо.
  • Вопрос задан
  • 2467 просмотров
Пригласить эксперта
Ответы на вопрос 4
Посмотрите на django-hstore (при условии, что вы можете использовать PostgreSQL). Это поле, в котором можно хранить произвольное число пар ключ - значение. Таким образом, общие для всех видов товаров поля вы храните как обычные поля модели, а меняющиеся поля пакуете в hstore. По этим запакованным полям можно даже делать поиск, за счёт того, что HStore - это родной для PostgreSQL тип данных.

Ещё вы можете использовать тип JSON, тоже специфический для PostgreSQL. Отличается от hstore тем, что структура поля может быть древовидной и значения - типизированными (собственно, что и предполагает JSON). Пакетов, которые поддерживают это поле в Django, существует несколько, можно погуглить.

Также вариантом является упомянутый EAV, но лично мне очень не нравится этот подход. Отсутствие контроля типов, крайне низкая скорость на больших объёмах и общая уродливость решения. SQL-база данных создана не для того, чтоб её как key-value использовать. Лучше уж немного расширить её возможности костылями типа hstore.
Ответ написан
un1t
@un1t
Я думал на эту тему, как лучше делать такие каталоги и пришел к выводу, что базу можно использовать любую, а фасеты строить с помощью полнотекстового поиска. Я предпочитаю Elasticsearch.
Свойства товаров можно хранить в каком-нибудь JSONField. На самом деле абсолютно без разницы как их хранить, главное как запихнуть в индекс.
Как вариант MongoDB умеет строить фасетные индексы. Но на сайте обычно в любом случае нужен поисковый движек, так что обхожусь без монговсих фасетов.
Ответ написан
@chemiron
Такие свойства сохраняю с помощью eav-django. Поиск делаю с помощью Sphinx - загоняю в мультиаттрибут все значения свойств для каждого товара и дальше запросом к sphinx можно вытянуть список id товаров, подходящих под фильтры. Плюс такого подхода еще в том, что можно совместить отбор по фильтрам и полнотекстовый поиск.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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