【问题标题】: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)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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 感谢您的更多澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2019-04-18
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多