我的问题是我必须为des
,gender
,min_age
,max_age
等特定字段的用户查询数据库。当我使用多个值时,它使用filter_queryset
正常工作。然后我使用了gender
其工作的多个值,但是当我不在我的网址中包含gender
代码时,代码中断主要是因为split
无法正常工作。
所以我想使用多个if/else
,其中queryset.filter(des__in=[], gender__in=[])
或gender
不可用,然后查询 - > queryset.filter(des__in=[])
。我在这里遗漏了很多东西。请帮忙
API - /v1/users/query_users?des=1,2&gender=Male,Female&min_age=2&max_age=4
class ProductFilter(django_filters.rest_framework.FilterSet):
min_age = django_filters.DateRangeFilter(name="dob", lookup_expr="gte")
max_age = django_filters.DateRangeFilter(name="dob", lookup_expr="lte")
class Meta:
model = UserProfile
fields = ['des', 'gender', 'min_age', 'max_age']
class QueryUserGroup(generics.ListAPIView):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_class = ProductFilter
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def filter_queryset(self, queryset):
des_list = self.request.GET.getlist("des")
gender_list = self.request.GET.getlist("gender")
des_ids = des_list[0].split(',')
gender_ids = gender_list[0].split(',')
return queryset.filter(des__in=des_ids, gender__in=gender_ids)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = UserProfileSerializer(queryset, many=True)
return JSONResponse({'data': serializer.data}, status=HTTP_200_OK)
答案 0 :(得分:1)
您应重新排列代码,以便只有在字段位于查询字符串中时才拆分字符串并过滤查询集。
由于您只访问了列表中的第一项,因此您也可以使用get
代替getlist
。
def filter_queryset(self, queryset):
des = self.request.GET.get("des")
if des is not None:
des_ids = des.split(',')
queryset = queryset.filter(des__in=des_ids)
gender = self.request.GET.get("gender")
if gender is not None:
gender_ids = gender.split(',')
queryset = queryset.filter(gender__in=gender_ids)
return queryset
如果你有两个以上的字段,你可以通过遍历字段名列表来减少重复的代码:
def filter_queryset(self, queryset):
for fieldname in ("des", "gender"):
value = self.request.GET.get(fieldname)
if value is not None:
ids = value.split(',')
queryset = queryset.filter(**{'%s__in' % fieldname: ids})
return queryset