过滤器集字段不适用于多个对象
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()
来获取LeaveApplication
s。所以它使过滤器后端类不被调用。
这可能是您的解决方案:
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 感谢您的更多澄清!以上是关于过滤器集字段不适用于多个对象的主要内容,如果未能解决你的问题,请参考以下文章