Python Django rest框架视图集get_queryset()不';t返回正确的查询集

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

我正在使用Django Rest框架过滤器来访问我的数据。我为我的一个模型编写了一个自定义视图集,用于处理url请求的某些特定字段上的逻辑“或”操作

这是我的ViewSet类(打印只是为了调试)

和MyModelFilter类:

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')