pip install djangorestframework
pip install markdown
pip install django-filter
E:\workspace\django-project\day1\django_drf>python manage.py startapp myapp
django_drf
│ manage.py
│
├─django_drf
│ │ asgi.py
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│
├─myapp
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ views.py
│
└─templates
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp/urls.py'))
]
from django.urls import path,re_path
from myapp import views
urlpatterns = [
]
from django.db import models
class User(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
sex = models.CharField(max_length=16)
age = models.IntegerField()
E:\workspace\django-project\day1\django_drf>python manage.py makemigrations
E:\workspace\django-project\day1\django_drf>python manage.py migrate
from myapp.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
from myapp.models import User
from .serializers import UserSerializer
from rest_framework import viewsets
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
from django.urls import path,include
from myapp import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'user', views.UserViewSet)
urlpatterns = [
path('api/',include(router.urls))
]
http://127.0.0.1:8000/myapp/api/user/ #列出所有数据
http://127.0.0.1:8000/myapp/api/user/1/ #对于指定数据进行更新,删除,查看操作
在日常开发中,会从别的API获取数据或者自己写API提供数据,数据格式一般都是采用JSON格式。这期间就会涉及两个专业术语:
之前经常用json模式完成序列化与反序列化操作:
Serializers是Django内置的一个序列化器,可直接将Python对象转为JSON格式,但不支持反序列化
from django.core import serializers
obj = User.objects.all()
data = serializers.serialize('json', obj)
JsonResponse模块自动将Python对象转为JSON对象并响应。
DRF中有一个serializers模块专门负责数据序列化,DRF提供的方案更先进、更高级别的序列化方案。
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()
city = serializers.CharField()
sex = serializers.CharField()
age = serializers.CharField()
from rest_framework.views import APIView
from rest_framework.response import Response
class UserApiView(APIView):
def get(self,request,id=None):
#获取单条数据
if id:
user_obj = User.objects.get(id=id)
user_serializers = UserSerializer(user_obj)
else:
#返回所有数据
queryset = User.objects.all()
user_serializers = UserSerializer(queryset,many=True)
return Response(user_serializers.data)
from django.urls import re_path
from myapp import views
urlpatterns = [
re_path('api/user/$',views.UserApiView.as_view()),
re_path('api/user/(?P<pk>\d+)/$',views.UserApiView.as_view()),
]
b. 查看单条数据: http://127.0.0.1:8000/myapp/api/user/1/
上述的配置不变,只需要变动视图和序列化
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import User
from .serializers import UserSerializer
class UserApiView(APIView):
def get(self,request,id=None):
#获取单条数据
if id:
user_obj = User.objects.get(id=id)
user_serializers = UserSerializer(user_obj)
else:
#返回所有数据
queryset = User.objects.all()
user_serializers = UserSerializer(queryset,many=True)
return Response(user_serializers.data)
def post(self,request):
#数据反序列化
user_ser = UserSerializer(data=request.data) #request.data是用户POST数据
if user_ser.is_valid():
#保存数据库
user_ser.save()
res = {'code': 200, 'msg': '创建用户成功'}
else:
res = {'code': 500, 'msg': '创建用户失败'}
return Response(res)
from myapp.models import User
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()
city = serializers.CharField()
sex = serializers.CharField()
age = serializers.IntegerField()
def create(self, validated_data):
return User.objects.create(**validated_data)
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import User
from .serializers import UserSerializer
from rest_framework import viewsets
class UserApiView(APIView):
def get(self,request,id=None):
#获取单条数据
if id:
user_obj = User.objects.get(id=id)
user_serializers = UserSerializer(user_obj)
else:
#返回所有数据
queryset = User.objects.all()
user_serializers = UserSerializer(queryset,many=True)
return Response(user_serializers.data)
def post(self,request):
#数据反序列化
user_ser = UserSerializer(data=request.data) #request.data是用户POST数据
if user_ser.is_valid():
#保存数据库
user_ser.save()
res = {'code': 200, 'msg': '创建用户成功'}
else:
res = {'code': 500, 'msg': '创建用户失败'}
return Response(res)
def put(self,request,id=None):
user_obj = User.objects.get(id=id)
user_serializer = UserSerializer(instance=user_obj, data=request.data)
if user_serializer.is_valid():
user_serializer.save()
res = {'code': 200, 'msg': '更新用户成功'}
else:
res = {'code': 500, 'msg': '更新用户失败'}
return Response(res)
def delete(self,request,id=None):
user_obj = User.objects.get(id=id)
user_obj.delete()
res = {'code': 200, 'msg': '删除用户成功'}
return Response(res)
from myapp.models import User
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()
city = serializers.CharField()
sex = serializers.CharField()
age = serializers.IntegerField()
def create(self, validated_data):
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
return User.objects.filter(id=instance.id).update(**validated_data)
from myapp.models import User
from .serializers import UserSerializer
from rest_framework import viewsets
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
class UserApiView(APIView):
def get(self,request,id=None):
#获取单条数据
if id:
user_obj = User.objects.get(id=id)
user_serializers = UserSerializer(user_obj)
else:
#返回所有数据
queryset = User.objects.all()
user_serializers = UserSerializer(queryset,many=True)
return Response(user_serializers.data)
def post(self,request):
#数据反序列化
user_serializer = UserSerializer(data=request.data) #request.data是用户POST数据
user_serializer.is_valid(raise_exception=True)
user_serializer.save()
res = {'code': 200, 'msg': '创建用户成功'}
return Response(res)
def put(self,request,id=None):
user_obj = User.objects.get(id=id)
user_serializer = UserSerializer(instance=user_obj, data=request.data)
user_serializer.is_valid(raise_exception=True)
user_serializer.save()
res = {'code': 200, 'msg': '创建用户成功'}
return Response(res)
def delete(self,request,id=None):
user_obj = User.objects.get(id=id)
user_obj.delete()
res = {'code': 200, 'msg': '删除用户成功'}
return Response(res)
如果常用参数无法满足验证要求时,可通过钩子方法扩展验证规则。