DRF配置步骤
- pip安装
djangorestframework
markdown
django-filter
- 在settings.py中激活
INSTALLED_APPS = [
……
'rest_framework'
]
DRF中的请求和响应
-
Django-request
类型:WSGIRequest
方式:GET、POST -
Django-response
HttpResponse、render、redirect、JsonResponse -
DRF-request
类型:rest_framework.request
request.POST:POST
request.data:POST\PUT\PATCH -
DRF-response
Response(data)
DRF使用
api_view
@api_view(["GET", "POST", ...])
①限定请求方式;
②改变request类型。
请求request
-
接收POST\PUT\PATCH
params = request.data.dict()
-
接收GET
request.query_params
响应response
from rest_framework.response import Response
from rest_framework import status
def xx:
query_set = User.objects.all()
# 序列化,结果为字符串
data = serialize("json", query_set)
# 转化为json
data = json.loads(data)
return Response(data, status=status.HTTP_200_OK)
- Response会直接将json格式的数据进行排版:
- csrf在drf中失效
- 状态码:
默认200
状态码的官方解释
响应参数:drf序列化器
-
django中的序列化
django.forms.model_to_dict(针对模型对象)
django.core.serializers.serialize(针对queryset)
-
drf中的序列化
from rest_framework.serializers import Serializer(类似form)
from rest_framework.serializers import ModelSerializer(类似modelform)
-
Serializer
- 在应用下新建
serializers.py
from rest_framework import serializer
class UserSerializer(serializers.Serializer):
# 定义需要接收的数据
username = serializers.CharField()
password = serializers.CharField()
gender = serializers.CharField()
tel = serializers.CharField()
接收数据时只收到serializer中定义的字段;
不会默认增加pk字段
- 用于返回对象
from .serializers import *
# 查询用户
@api_view(["GET"])
def find_user(request):
users = User.objects.all()
# 默认序列化单个数据,序列化多个数据时设置many=True
serializer = UserSerializer(users, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
- 用于接收参数
# 增加用户
@api_view(["POST"])
@csrf_exempt
def add_user(request):
# 接收参数
serializer = UserSerializer(data=request.data)
# 校验通过:
if serializer.is_valid():
# 存储数据
params = request.data.dict()
user = User.objects.create(**params)
user = model_to_dict(user)
return Response(user, status=status.HTTP_201_CREATED)
# 校验失败:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
上面的代码如果直接使用serializer.save()存储数据会报错:
'create()' must be implemented.
解决:
在serializer.py中重写父类的create方法
from rest_framework import serializers
from user.models import *
class UserSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
gender = serializers.CharField()
tel = serializers.CharField()
def create(self, validated_data):
"""
存储数据
:param validated_data: 校验通过的数据
:return:
"""
return User.objects.create(**validated_data)
在视图中调用
# 增加用户
@api_view(["POST"])
@csrf_exempt
def add_user(request):
# 接收参数
serializer = UserSerializer(data=request.data)
# 校验通过:(校验属性写在UserSerializer中)
if serializer.is_valid():
# 存储数据
serializer.save()
return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
# 校验失败:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
使用drf完善项目应用user的增删改查功能
- 修改时如果报错
"This field is required."
在UserSerializer的字段中增加约束require=False:
username = serializers.CharField(required=False)
- 代码
# ==============================urls.py===================================
from django.urls import path
from user import views
urlpatterns = [
path('add', views.add_user, name='add'),
path('find', views.find_user, name='find'),
path('alter/<int:pk>', views.alter_user, name='alter'),
path('delete/<int:pk>', views.delete_user, name='delete'),
path('query/<int:pk>', views.query_user, name='query')
]
# ==============================serializers.py===================================
from rest_framework import serializers
from user.models import *
class UserSerializer(serializers.Serializer):
username = serializers.CharField(required=False)
password = serializers.CharField(required=False)
gender = serializers.CharField(required=False)
tel = serializers.CharField(required=False)
def create(self, validated_data):
"""
存储数据
:param validated_data: 校验通过的数据
:return:
"""
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
"""
:param instance: 查询到的对象
:param validated_data: 校验通过的数据
:return:
"""
users = User.objects.filter(pk=instance.pk)
users.update(**validated_data)
return users[0]
# ==============================views.py===================================
import json
from django.core.serializers import serialize
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from user.models import *
from django.forms import model_to_dict
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .serializers import *
# 增加用户
@api_view(["POST"])
@csrf_exempt
def add_user(request):
# params = request.POST.dict()
# user = User.objects.create(**params)
# user = model_to_dict(user)
# params = request.data.dict()
# user = User.objects.create(**params)
# user = model_to_dict(user)
# return Response(user, status=status.HTTP_201_CREATED)
# # 接收参数
# serializer = UserSerializer(data=request.data)
#
# # 校验通过:(校验属性写在UserSerializer中)
# if serializer.is_valid():
# # 存储数据
# params = request.data.dict()
# user = User.objects.create(**params)
# user = model_to_dict(user)
#
# return Response(user, status=status.HTTP_201_CREATED)
#
# # 校验失败:
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 接收参数
serializer = UserSerializer(data=request.data)
# 校验通过:(校验属性写在UserSerializer中)
if serializer.is_valid():
# 存储数据
serializer.save()
return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
# 校验失败:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 查询用户
@api_view(["GET"])
def find_user(request):
# users = User.objects.all()
# data = serialize("json", users)
# # return Response(data, safe=False, json_dumps_params={"ensure_ascii": False})
# return Response(json.loads(data), status=status.HTTP_200_OK)
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# 修改用户
@api_view(["PUT"])
def alter_user(request, pk):
user = User.objects.get(pk=pk)
serializer = UserSerializer(instance=user, data=request.data)
if serializer.is_valid():
# 更新方法与新增相同
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 删除用户
@api_view(["DELETE"])
def delete_user(request, pk):
User.objects.filter(pk=pk).delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# 查询单个用户
@api_view(["POST"])
def query_user(request, pk):
user = User.objects.filter(pk=pk)
if user.exists():
serializer = UserSerializer(instance=user, data=request.data)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(status=status.HTTP_400_BAD_REQUEST)