Python Django rest框架视图集get_queryset()不';t返回正确的查询集
我正在使用Django Rest框架过滤器来访问我的数据。我为我的一个模型编写了一个自定义视图集,用于处理url请求的某些特定字段上的逻辑“或”操作 这是我的ViewSet类(打印只是为了调试) 和MyModelFilter类:Python Django rest框架视图集get_queryset()不';t返回正确的查询集,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django Rest框架过滤器来访问我的数据。我为我的一个模型编写了一个自定义视图集,用于处理url请求的某些特定字段上的逻辑“或”操作 这是我的ViewSet类(打印只是为了调试) 和MyModelFilter类: class MyModelFilter(ModelFilterSet): class Meta: model = appart.MyModel fields = ('id', 'libelle', 'locataire_appa
class MyModelFilter(ModelFilterSet):
class Meta:
model = appart.MyModel
fields = ('id', 'libelle', 'locataire_appart', 'bien_appart',
'adresse', 'loyer_appart', 'caracteristique', 'caracteristique_text',
'date_creation', 'derniere_maj')
这段代码运行得很好,并且做了我希望它做的事情。他获取url参数,动态创建请求语法并返回我要查找的数据
唯一的问题是,最后的返回结果与我在代码中打印的结果不一样。他仍然试图基于给定的url执行GET请求,并且在语法不符合django_过滤器规则时不返回任何内容
有人能帮我防止我的视图集出现这种行为吗?您需要使用Django过滤器指定一些过滤器。我想您只需要
BaseInFilter
:
好的,我终于解决了我的问题,代码中没有错误。这是由于
filter\u class=MyModelFilter
造成的。我刚刚对这句话发表了评论,一切都开始起作用了。老实说,我不知道为什么,但如果有人知道原因,我将非常感谢对这个答案的评论
我还查看了@schillingt所说的exec
,下面是那些试图做同样事情或遇到同样问题的人的结果
class CustomViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = models.MyModel.objects.order_by('pk')
serializer_class = MyModelSerializer
filter_class = MyModelFilter
def get_queryset(self):
query = dict(self.request.query_params)
ct = self.request.query_params.get('caracteristique_text__icontains', None)
cl = self.request.query_params.get('caracteristique__libelle__in', None)
if ct is not None and cl is not None:
self.filter_class = None
ct_query = query['caracteristique_text__icontains'][0].split(',')
cl_query = query['caracteristique__libelle__in'][0].split(',')
full_query = Q(caracteristique__libelle__in=cl_query)
ct = Q()
for value in ct_query:
ct_part = Q(caracteristique_text__icontains=value)
ct |= ct_part
full_query &= ct
self.queryset = self.queryset.filter(full_query)
return self.queryset
return models.MyModel.objects.order_by('pk')
这篇文章也很有帮助你能包括
MyModelFilter
吗?我认为使用django_过滤器功能是一个更好的主意。另外,您当前的方法存在一个主要的安全漏洞,您允许外部用户在您的系统中执行代码(调用exec
)。我刚刚添加了MyModelFilter
,意识到了exec
的一个大错误。我将寻找一种更好的方法来实现这个技巧,并希望filter类能够帮助您找到问题所在。再次感谢!
class MyModelFilter(ModelFilterSet):
caracteristique_text = BaseInFilter(field_name='caracteristique_text', lookup_exp='icontains')
libelle = BaseInFilter(field_name='libelle', lookup_exp='in')
class Meta:
model = appart.MyModel
fields = ('id', 'libelle', 'locataire_appart', 'bien_appart',
'adresse', 'loyer_appart', 'caracteristique', 'caracteristique_text',
'date_creation', 'derniere_maj')
class CustomViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = models.MyModel.objects.order_by('pk')
serializer_class = MyModelSerializer
filter_class = MyModelFilter
def get_queryset(self):
query = dict(self.request.query_params)
ct = self.request.query_params.get('caracteristique_text__icontains', None)
cl = self.request.query_params.get('caracteristique__libelle__in', None)
if ct is not None and cl is not None:
self.filter_class = None
ct_query = query['caracteristique_text__icontains'][0].split(',')
cl_query = query['caracteristique__libelle__in'][0].split(',')
full_query = Q(caracteristique__libelle__in=cl_query)
ct = Q()
for value in ct_query:
ct_part = Q(caracteristique_text__icontains=value)
ct |= ct_part
full_query &= ct
self.queryset = self.queryset.filter(full_query)
return self.queryset
return models.MyModel.objects.order_by('pk')