Возможно ли написать абстрактную функцию фильтрации по HStoreField?

Здравствуйте! Стек, с которым я работаю:
Django 1.9 и Django REST framework для создания API.
django-hstore для работы с HStoreField, в котором я храню атрибуты товаров.
django-filter используется для фильтрации товаров. Из коробки работать с HStoreField не захотел. В документации нашел django_filters.MethodFilter, который позволяет составить кастомный queryset. Однако с этим возникло несколько проблем. Во-первых, атрибуты динамические, так что писать фильтры вида:
class ProductFilter(django_filters.FilterSet):
    scu = django_filters.MethodFilter(action='filter_scu')

    def filter_scu(self, queryset, value):
        queryset = Product.objects.filter(attributes__contains={'scu':value})
        return queryset

    class Meta:
        model = Product
        fields = ['scu', ]

можно бесконечно. Во-вторых, несколько таких функций работаю как OR, а надо как AND. Подскажите, как составить подобную функцию, принимающую словарь вида
attributes={"scu": "214412", "manufacturer": "hp", ...}
и собирающую queryset:
Product.objects.filter(attributes__contains={key:value).filter(...)
  • Вопрос задан
  • 276 просмотров
Решения вопроса 1
@deliro
from functools import reduce

class Product(Model):
    attributes = HStoreField()

    @classmethod
    def filter(cls, data):
        return reduce(
            lambda qs, x: qs.filter(attributes__contains={x[0]: x[1]}), 
            data.items(), cls.objects.all()
        )

Так что ли?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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