Django Rest Framework - использовать все параметры запроса, не входящие в стандартные фильтры, в качестве запроса поля JSON postgres - PullRequest
0 голосов
/ 16 января 2019

У меня есть модель (назовите ее Thing), она имеет 4 поля: thing1, thing2, thing3, thing4.

Я хочу фильтровать, используя параметры запроса, против thing1 и thing2, я не хочу фильтровать по thing3, а thing4 - это поле JSON. Все параметры запроса, кроме thing1 и thing2, должны быть объединены вместе, чтобы сформировать фильтр для thing4 (поле JSON).

Сейчас у меня есть следующее:

models.py

from django.contrib.postgres.fields import JSONField
class Thing(models.Model):
    thing1 = models.CharField()
    thing2 = models.CharField()
    thing3 = models.CharField()
    thing4 = JSONField()

views.py

class ThingViewSet(viewsets.ModelViewSet):
    queryset = Thing.objects.all()
    serializer_class = ThingSerializer
    filter_fields = ('thing1', 'thing2')

    class Meta:
        model = Thing
        fields = '__all__'

    def filter_queryset(self, *args, **kwargs):
        query_dict = self.request.GET.dict()
        thing4_filter_dict = {}
        for field, value in query_dict.items():
            if field in self.filter_fields:
                continue
            thing4_filter_dict['thing4__%s' % key] = value
        return super().filter_queryset(*args, **kwargs).filter(**thing4_filter_dict)

затем вы можете позвонить, используя, например,

GET http://localhost:8000/things/?thing1=some_value&other_thing=1&some_other_thing=2

И здесь other_thing=1 и some_other_thing=2 будут использоваться для фильтрации по JSONField (thing4)

У кого-нибудь есть предложения по лучшему способу сделать это? В исходном коде django документы для filter_queryset говорят что-то вроде: «вы, вероятно, не хотите переопределять этот метод».

Так что мне интересно, есть ли какой-нибудь другой лучший способ получить эту функциональность.

...