例如,我有一个简单的django模型:
class SimpleModel(models.Model):
some_attr = models.JSONField() #there is [attr1, attr2, ...] in JSON
简单观点:
class SimpleView(ListCreateApivView):
filter_backends = [DjangoFilterBackend, ]
filterset_class = SimpleFilter
和简单的过滤器:
class SimpleFilter(django_filters.FilterSet):
class Meta:
model = SimpleModel
fields = {'some_attr': ['icontains', ]}
我想检查我的db‘中的[http://127.0.0.1/simple?some_attr__icontains=['Something](http://127.0.0.1/simple?some_attr__icontains=%5B%27Something),]在我的db中有JSONField,它包含a1、a2、a3 .所以,如何检查来自url在db JSONField中的值?
发布于 2022-04-28 09:57:58
谢谢您的回答,我解决了为JSON字段创建自定义过滤器的问题,如下所示:
class CharInFilter(filters.BaseInFilter, filters.CharFilter):
pass
class MainInfoFilter(filters.FilterSet):
some_attr = CharInFilter(method='some_attr_filter')
def some_attr_filter(self, queryset, name, value):
query = Q()
for type in value:
query |= Q(license_types__icontains=type)
if query:
queryset = queryset.filter(query)
return queryset
发布于 2022-04-27 14:36:48
我会像这样覆盖get_queryset
方法:
views.py
import json
class SimpleView(...):
...
def get_queryset(self):
# unpack the filter:
filter_string = self.request.GET.get('filter', {})
filter_dictionary = json.loads(filter_string)
# filter queryset:
queryset = self.queryset.filter(**filter_dictionary)
return queryset
然后你可以在前面做这样的事情:
scripts.js
// create a django like filter:
var filter = JSON.stringify({
some_attr__some_key__icontains : 'some_value'
});
// add the filter as a parameter to the url:
var url = 'api/simple_model/?filter=' + filter;
// send the request:
$.ajax({
url : url,
...
});
https://stackoverflow.com/questions/72030458
复制相似问题