基 于 D R F 的 增 删 改 查 操 作 基于DRF的增删改查操作 基于DRF的增删改查操作
一 APIView
from django.urls import path
from .views import PersontView
app_name = 'classview'
urlpatterns = [
# 列表: /person/ get
# 新增: /person/ post
# 详情: /person/[pk]/ get
# 修改: /person/[pk]/ put
# 删除: /person/[pk]/ delete
path('person/',PersontView.as_view()),
path('person/<int:pk>/',PersontView.as_view()),
]
from rest_framework.views import APIView
from django.http import Http404
from rest_framework.response import Response
from apps.drf_demo.models import Person
from .serializers import PersonSerializer
from rest_framework import status
class PersontView(APIView):
"""
检索, 更新和删除一个merchant实例对象.
"""
def get_object(self, pk):
try:
return Person.objects.get(pk=pk)
except Person.DoesNotExist:
raise Http404
def get(self, request, pk=None):
if pk:
merchant= self.get_object(pk)
serializer = PersonSerializer(merchant)
return Response(serializer.data)
else:
queryset = Person.objects.all()
serializer = PersonSerializer(instance=queryset,many=True)
return Response(serializer.data)
def put(self, request, pk):
merchant = self.get_object(pk)
serializer = PersonSerializer(merchant, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
merchant= self.get_object(pk)
merchant.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
二 QuerySet使用
- filter
- exclude
- annotate
- order_by
- values
- values_list
- all
- select_related
- prefetch_related
- defer
- only
- get
- create
- get_or_create
- bulk_create
- count
- exists
- distinct
- update
- delete
三 补充:
DRF中的Request和Response对象
在drf
中,可以使用 Request
和 Response
对象来替代 django
内置的 HttBRequest
和 HttpResponse
。替代 django
的对象有很多好处。以下进行简单讲解。
Request对象:
DRF
的 Request对象
是从HttpRequest中拓展出来的
,但是增加了一些其他的属性。其中最核心的用得最多的属性便是request.data
。request.data
比 request.POST
更加灵活:
request.POST
:只能处理表单数据,获取通过POST方式上传上来的数据。request.data
:可以处理任意的数据。可以获取通过POST 、PUT 、PATCH 等方式上传上来的数据。request.query_params
:查询参数。比 request.GET更用起来更直白。
Response对象:
Response
可以自动的根据返回的数据类型来决定返回什么样的格式。并且会自动的监听如果是浏览器访问,那么会返回这个路由的信息。
@require_http_methods(['GET','POST'])
def category(request):
if request.method =="GET":
queryset = GoodsCategory.objects.all()
serializer = GoodsCategorySerializer(instance=queryset,many=True)
return JsonResponse(serializer.data,safe=False)
else:
serializer = GoodsCategorySerializer(data=request.POST)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=200)
else:
return JsonResponse(serializer.errors, status=400)
状态码