过滤器集字段不适用于多个对象

Posted

技术标签:

【中文标题】过滤器集字段不适用于多个对象【英文标题】:Filterset field not working for multiple object 【发布时间】:2021-07-07 12:33:22 【问题描述】:

filterset 字段不适用于单个员工休假详细信息的多次休假,我该如何解决?

class LeaveApplicationGetUpdateView(RetrieveUpdateAPIView):
    serializer_class = LeaveApplicationSerializers
    queryset = LeaveApplication.objects.filter()
    permission_classes = (IsAuthenticated, IsSuperUser)
    filter_backends = [filters.OrderingFilter, DjangoFilterBackend]
    filterset_fields = ['type', 'from_date', 'to_date']

    def get(self, request, *args, **kwargs):
        contact_inf = LeaveApplication.objects.filter(employee__code=self.kwargs.get('code'))  # will be refactor
        if contact_inf:
            return Response(
                'success': True,
                'message': 'Successfully',
                'data': LeaveApplicationSerializers(contact_inf, many=True).data
            , status=200)
        else:
            return Response(
                'success': False,
                'message': 'Not Found'
            , status=200)

【问题讨论】:

【参考方案1】:

这是因为您没有调用self.get_queryset() 来获取LeaveApplications。所以它使过滤器后端类不被调用。

这可能是您的解决方案:

def get(self, request, *args, **kwargs):
        contact_inf = self.get_queryset().filter(employee__code=self.kwargs.get('code'))

最好改一下:

queryset = LeaveApplication.objects.filter()

到这里:

queryset = LeaveApplication.objects.all()

还有这个:

if contact_inf:

到这里:

if bool(contact_inf):

见this

此外,如果 some_queryset 还没有被评估,但你知道它会在某个时候被评估,那么使用 some_queryset.exists() 将做更多的整体工作(一个查询存在检查加上一个额外的稍后检索结果)而不是使用 bool(some_queryset) 检索结果,然后检查是否返回任何结果。

【讨论】:

if contact_inf.exists() 将不必要地导致进行 2 次查询。 if contact_inf: 将只使用一个查询(查询将在此步骤进行评估,并且序列化程序将使用相同的评估查询集)。因此,该特定行实际上比您的建议更好。 @AbdulAzizBarkat 哦,你是对的!我做了更多的研究,发现我们应该改用bool()。我已经更新了我的答案。谢谢! @PreetiYuankrathok 是的,但实际上没有必要在那里调用bool,因为解释器会自动这样做,因为这是一个if 语句。 :) @AbdulAzizBarkat 感谢您的更多澄清!

以上是关于过滤器集字段不适用于多个对象的主要内容,如果未能解决你的问题,请参考以下文章

Logstash,grok 过滤器不适用于固定长度字段

Couchdb 视图不适用于多个过滤器

Couchdb视图不适用于多个过滤器

过滤和分页不适用于 ngxpagination 模板

返回过滤器搜索结果不适用于角度

2 Model层 - 模型查询