如何在Django Filterset中实现字段的条件必填?
实现FilterSet二选一字段校验的方法
首先把两个字段的required=True去掉,因为我们不需要强制两个都填,而是要求二选一:
from django_filters import filters, FilterSet from django.core.exceptions import ValidationError class AnimalFilter(filters.FilterSet): animal_family = filters.CharFilter(required=False) is_land_animal = filters.BooleanFilter(required=False) def clean(self): cleaned_data = super().clean() animal_family = cleaned_data.get('animal_family') is_land_animal = cleaned_data.get('is_land_animal') # 校验:必须且只能填其中一个字段 if (animal_family is None and is_land_animal is None) or (animal_family is not None and is_land_animal is not None): raise ValidationError("必须填写`animal_family`或`is_land_animal`中的一个,不能同时填或者都不填") return cleaned_data
逻辑说明:
- 先通过父类的
clean方法获取清洗后的参数 - 分别取出两个字段的取值,判断两种非法情况:两个都没传或者两个都传了
- 只要触发任意一种非法情况,就抛出验证错误,提示用户必须二选一
这样就能实现你要的效果:用户要么传animal_family,要么传is_land_animal,两种情况二选一,不符合规则的请求会被拦截并返回错误提示。
内容的提问来源于stack exchange,提问作者Pittfall
相关产品推荐
相关产品推荐

