如果某个API需要传递一些条件进行搜索,其实就在是URL后面通过GET传参即可,例如:
/api/users?age=19&category=12

在drf中也有相应组件可以支持条件搜索。
# urls.pyfrom django.urls import pathfrom app01 import viewsurlpatterns = [path('api/users/', views.UserView.as_view({"get": "list", "post": "create"})),path('api/users/<int:pk>/', views.UserView.as_view({"get": "retrieve", "put": "update", "patch": "partial_update", "delete": "destroy"})),]
# views.pyfrom rest_framework import serializersfrom rest_framework.viewsets import ModelViewSetfrom rest_framework.filters import BaseFilterBackendfrom app01 import modelsclass UserModelSerializer(serializers.ModelSerializer):level_text = serializers.CharField(source="get_level_display",read_only=True)extra = serializers.SerializerMethodField(read_only=True)class Meta:model = models.UserInfofields = ["username", "age", "email", "level_text", "extra"]def get_extra(self, obj):return 666class Filter1(BaseFilterBackend):def filter_queryset(self, request, queryset, view):age = request.query_params.get('age')if not age:return querysetreturn queryset.filter(age=age)class Filter2(BaseFilterBackend):def filter_queryset(self, request, queryset, view):user_id = request.query_params.get('id')if not user_id:return querysetreturn queryset.filter(id__gt=user_id)class UserView(ModelViewSet):filter_backends = [Filter1, Filter2]queryset = models.UserInfo.objects.all()serializer_class = UserModelSerializerdef perform_create(self, serializer):""" 序列化:对请求的数据校验成功后,执行保存。"""serializer.save(depart_id=1, password="123")
