У меня есть модель (назовите ее 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
говорят что-то вроде: «вы, вероятно, не хотите переопределять этот метод».
Так что мне интересно, есть ли какой-нибудь другой лучший способ получить эту функциональность.