有没有办法在Django Filterset中有条件地要求一个字段?

sqyvllje  于 2023-03-20  发布在  Go
关注(0)|答案(2)|浏览(98)

假设我有一个过滤器组:

class AnimalFilter(filters.FilterSet):
     animal_family = filters.CharFilter(required=True)
     is_land_animal = filters.BooleanFilter(required=True)

但是如果我只想为其中一个设置required=True,比如如果有人传入animal_family,我不需要接收is_land_animal,反之亦然。

ddrv8njm

ddrv8njm1#

如果你想设置required=True,那么你必须在get方法中使用qurey_params来获取你想显示的属性。

def list(self, request, *args, **kwargs):
    user = self.request.user
    company = user.branch.company
    branch = user.branch
    assetID = self.request.query_params.get('assetID', None)
    if assetID is not None:
        asset_query = Assets.objects.filter(company=company, branch=branch, id=assetID)
        if asset_query.exists():
            asset_detail = YourModel.values('id', 'name', 'asset_id', 'purchase_date').\
                annotate(asset_category_name=F('asset_category__category_name'),
                         asset_user_first_name=F('asset_user__first_name'),
                         asset_user_last_name=F('asset_user__last_name'))
            return Response({'asset_details': asset_detail, 'history': history}, status=status.HTTP_200_OK)
        else:
            return Response({'message': 'This AssetID does not exist'}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response({'message': 'AssetID is required'}, status=status.HTTP_400_BAD_REQUEST))

API端点将如下发送
http://127.0.0.1:8000/apiName/?assetID=True
你必须记住我从端点接收到什么如果它是一个数字,那么发送数字如果它是布尔值,那么发送TRUE或FALSE如果它是任何字符串,那么发送string

xoshrz7s

xoshrz7s2#

你可能不得不使用一些未记录的东西(?),如果你看一下source of django-filters,你会发现在__init__中它把你的视图请求绑定到self.request。
因此,您可以使用method=编写这些过滤器,并提供方法代码,以便在调用self.request.GET时查看是否提供了“其他”过滤器,如果是,则不修改查询集。
两个过滤器required=False。如果你决定不提供任何一个,你需要检查某个地方(在你的视图的get方法中?),一个或另一个在request.GET中,并引发异常或重定向到一个错误视图。
在等待四分之一TB的数据复制时,我脑子里全是这些。

相关问题