向Django REST API添加过滤器
我是Django和REST的新手,我希望能够指定一个值,并让RESTAPI只返回满足该值的行。有点像sql向Django REST API添加过滤器,django,django-views,django-rest-framework,Django,Django Views,Django Rest Framework,我是Django和REST的新手,我希望能够指定一个值,并让RESTAPI只返回满足该值的行。有点像sqlselect*from exampleTBL,其中id=1,然后返回第一行。但这将通过url完成:www.website/api/tmpHost/?id=1,然后通过REST api返回第一行 我的观点是: class tmp_HostList(APIView): def get (self, request, format=None): tmp_hosts = tm
select*from exampleTBL,其中id=1
,然后返回第一行。但这将通过url完成:www.website/api/tmpHost/?id=1
,然后通过REST api返回第一行
我的观点是:
class tmp_HostList(APIView):
def get (self, request, format=None):
tmp_hosts = tmp_Host.objects.all()
serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request})
return Response(serializer.data)
def post(self, request, format=None):
serializer = tmp_HostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
url(r'^api/tmpHost/$', views.tmp_HostList.as_view()),
class tmp_HostSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
class Meta:
model = tmp_Host
fields = '__all__'
我的url看起来像:
class tmp_HostList(APIView):
def get (self, request, format=None):
tmp_hosts = tmp_Host.objects.all()
serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request})
return Response(serializer.data)
def post(self, request, format=None):
serializer = tmp_HostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
url(r'^api/tmpHost/$', views.tmp_HostList.as_view()),
class tmp_HostSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
class Meta:
model = tmp_Host
fields = '__all__'
我的序列化程序看起来像:
class tmp_HostList(APIView):
def get (self, request, format=None):
tmp_hosts = tmp_Host.objects.all()
serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request})
return Response(serializer.data)
def post(self, request, format=None):
serializer = tmp_HostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
url(r'^api/tmpHost/$', views.tmp_HostList.as_view()),
class tmp_HostSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
class Meta:
model = tmp_Host
fields = '__all__'
我该怎么做呢?我在这附近见过解决方案,但它们似乎对我不起作用。我使用APIView和我的序列化程序行的区别是:
serializer=tmp\u HostSerializer(tmp\u hosts,many=True,context={'request':request})
虽然他们的方法很简单,比如:serializer=tmp\u HostSerializer
最简单的方法就是检查get参数并通过参数返回一个过滤对象:
from django.shortcuts import get_object_or_404
class tmp_HostList(APIView):
def get (self, request, format=None):
param = request.GET.get('id')
if param:
tmp_host = get_object_or_404(Host, id=param)
serializer = tmp_HostSerializer(tmp_host)
else:
tmp_hosts = tmp_Host.objects.all()
serializer = tmp_HostSerializer(tmp_hosts, many=True)
return Response(serializer.data)
还有内置的通用视图和视图集过滤功能但最好的选择是为详细信息页面创建单独的视图或使用视图集/常规视图。
因此,您的视图将保持不变,并为详细信息页面添加一个新视图。
URL:
url(r'^api/tmpHost/(?P\d+)$,views.tmp_HostList.as_view())
观点:
你是从哪里得到变量“q”的,还是应该用过滤器来代替它?@JustinBraham它应该是
param
。我犯了一个错误