1.Django Rest Framework框架
先安装Django Rest Framework框架 pip install djangorestframework
在setting.py中进行配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index',
# 添加Django Rest Framework框架
'rest_framework'
]
# Django Rest Framework框架设置信息
# 分页设置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 每页显示多少条数据
'PAGE_SIZE': 2
}
定义项目模型
from django.db import models
class PersonInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
age = models.IntegerField()
hireDate = models.DateField()
def __str__(self):
return self.name
class Meta:
verbose_name = '人员信息'
class Vocation(models.Model):
id = models.AutoField(primary_key=True)
job = models.CharField(max_length=20)
title = models.CharField(max_length=20)
payment = models.IntegerField(null=True, blank=True)
name = models.ForeignKey(PersonInfo, on_delete=models.Case)
def __str__(self):
return str(self.id)
class Meta:
verbose_name = '职业信息'
对模型执行数据迁移
1.1 序列化类Serialize
在应用中serializers.py定义序列化类MySerializer
from rest_framework import serializers
from .models import PersonInfo, Vocation
# 定义Serializer类
# 设置模型Vocation的字段name的下拉内容
nameList = PersonInfo.objects.values('name').all()
NAME_CHOICES = [item['name'] for item in nameList]
class MySerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
job = serializers.CharField(max_length=100)
title = serializers.CharField(max_length=100)
payment = serializers.CharField(max_length=100)
# name = serializers.ChoiceField(choices=NAME_CHOICES, default=1)
# 模型Vocation的字段name是外键字段,它指向模型PersonInfo
# 因此外键字段可以使用PrimaryKeyRelatedField
name = serializers.PrimaryKeyRelatedField(queryset=nameList)
# 重写create函数,将API数据保存到数据表index_vocation
def create(self, validated_data):
return Vocation.objects.create(**validated_data)
# 重写update函数,将API数据更新到数据表index_vocation
def update(self, instance, validated_data):
return instance.update(**validated_data)
设置路由信息
from django.urls import path
from .views import *
urlpatterns = [
# 视图函数
path('', vocationDef, name='myDef'),
# 视图类
path('myClass/', vocationClass.as_view(), name='myClass'),
]
定义视图
from .models import PersonInfo, Vocation
from .serializers import MySerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def vocationDef(request):
if request.method == 'GET':
q = Vocation.objects.all()
# 分页查询,需要在settings.py设置REST_FRAMEWORK属性
pg = PageNumberPagination()
p = pg.paginate_queryset(queryset=q, request=request)
# 将分页后的数据传递MySerializer,生成JSON数据对象
serializer = MySerializer(instance=p, many=True)
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
elif request.method == 'POST':
# 获取请求数据
data = request.data
id = data['name']
data['name'] = PersonInfo.objects.filter(id=id).first()
instance = Vocation.objects.filter(id=data.get('id', 0))
if instance:
# 修改数据
MySerializer().update(instance, data)
else:
# 创建数据
MySerializer().create(data)
return Response('Done', status=status.HTTP_201_CREATED)
class vocationClass(APIView):
# GET请求
def get(self, request):
q = Vocation.objects.all()
# 分页查询,需要在settings.py设置REST_FRAMEWORK属性
pg = PageNumberPagination()
p = pg.paginate_queryset(queryset=q, request=request, view=self)
serializer = MySerializer(instance=p, many=True)
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
# POST请求
def post(self, request):
data = request.data
id = data['name']
data['name'] = PersonInfo.objects.filter(id=id).first()
instance = Vocation.objects.filter(id=data.get('id', 0))
if instance:
# 修改数据
MySerializer().update(instance, data)
else:
# 创建数据
MySerializer().create(data)
return Response('Done', status=status.HTTP_201_CREATED)
若使用视图函数开发API接口,必须对视图函数使用装饰器api_view,若使用视图类,对GET请求和POST请求进行不同的处理。
1.2 模型序列化类ModelSerializer
为了简化序列化类Serializer的定义过程,Django Rest Framework定义了模型序列化类ModelSerializer
以上节例子为例,将自定义的MySerializer改为VocationSerializer
from rest_framework import serializers
from .models import Vocation
# 定义ModelSerializer类
class VocationSerializer(serializers.ModelSerializer):
class Meta:
model = Vocation
fields = '__all__'
# fields = ('id', 'job', 'title', 'payment', 'name')
重新定义视图
from .models import PersonInfo, Vocation
from .serializers import VocationSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def vocationDef(request):
if request.method == 'GET':
q = Vocation.objects.all().order_by('id')
# 分页查询,需要在settings.py设置REST_FRAMEWORK属性
pg = PageNumberPagination()
p = pg.paginate_queryset(queryset=q, request=request)
# 将分页后的数据传递MySerializer,生成JSON数据对象
serializer = VocationSerializer(instance=p, many=True)
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
elif request.method == 'POST':
# 获取请求数据
id = request.data.get('id', 0)
# 判断请求参数id在模型Vocation是否存在
# 若存在,则执行数据修改,反之新增数据
operation = Vocation.objects.filter(id=id).first()
# 数据验证
serializer = VocationSerializer(data=request.data)
if serializer.is_valid():
if operation:
data = request.data
id = data['name']
data['name'] = PersonInfo.objects.filter(id=id).first()
serializer.update(operation, data)
else:
# 保存到数据库
serializer.save()
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
return Response(serializer.errors, status=404)
class vocationClass(APIView):
# GET请求
def get(self, request):
q = Vocation.objects.all().order_by('id')
# 分页查询,需要在settings.py设置REST_FRAMEWORK属性
pg = PageNumberPagination()
p = pg.paginate_queryset(queryset=q, request=request, view=self)
serializer = VocationSerializer(instance=p, many=True)
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
# POST请求
def post(self, request):
# 获取请求数据
id = request.data.get('id', 0)
operation = Vocation.objects.filter(id=id).first()
# 数据验证
serializer = VocationSerializer(data=request.data)
if serializer.is_valid():
if operation:
data = request.data
id = data['name']
data['name'] = PersonInfo.objects.filter(id=id).first()
serializer.update(operation, data)
else:
# 保存到数据库
serializer.save()
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
return Response(serializer.errors, status=404)
1.3 序列化的嵌套使用
在开发过程中需要对多个JSON数据进行嵌套,比如将模型PersonInfo和Vocation的数据组合放在同一个JSON数据转,两个模型的数据通过外键字段name进行关联。以上节例子为例,在serializer.py中定义PersonInfoserializer,Vacationserializer
from rest_framework import serializers
from .models import Vocation, PersonInfo
# 定义ModelSerializer类
class PersonInfoSerializer(serializers.ModelSerializer):
class Meta:
model = PersonInfo
fields = '__all__'
# 定义ModelSerializer类
class VocationSerializer(serializers.ModelSerializer):
name = PersonInfoSerializer()
class Meta:
model = Vocation
fields = ('id', 'job', 'title', 'payment', 'name')
def create(self, validated_data):
# 从validated_data获取模型PersonInfo的数据
name = validated_data.get('name', '')
id = name.get('id', 0)
p = PersonInfo.objects.filter(id=id).first()
# 根据id判断模型PersonInfo是否存在数据对象
# 若存在数据对象,只对Vocation新增数据
# 若不存在,首先对模型PersonInfo新增数据
# 然后再对模型Vocation新增数据
if not p:
p = PersonInfo.objects.create(**name)
data = validated_data
data['name'] = p
v = Vocation.objects.create(**data)
return v
def update(self, instance, validated_data):
# 从validated_data获取模型PersonInfo的数据
name = validated_data.get('name', '')
id = name.get('id', 0)
p = PersonInfo.objects.filter(id=id).first()
# 判断外键name是否存在模型PersonInfo
if p:
# 若存在,首先更新模型PersonInfo的数据
PersonInfo.objects.filter(id=id).update(**name)
# 然后更新模型Vocation的数据
data = validated_data
data['name'] = p
id = validated_data.get('id', '')
v = Vocation.objects.filter(id=id).update(**data)
return v
序列化类VocationSerializer对 PersonInfoSerializer进行实例化并赋值给变量name,而属性fileds的name代表模型Vocation的外键字段name,同时也是变量name。、
调整视图函数代码
from .models import Vocation
from .serializers import VocationSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def vocationDef(request):
if request.method == 'GET':
q = Vocation.objects.all().order_by('id')
# 分页查询,需要在settings.py设置REST_FRAMEWORK属性
pg = PageNumberPagination()
p = pg.paginate_queryset(queryset=q, request=request)
# 将分页后的数据传递MySerializer,生成JSON数据对象
serializer = VocationSerializer(instance=p, many=True)
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
elif request.method == 'POST':
# 获取请求数据
id = request.data.get('id', 0)
# 判断请求参数id在模型Vocation是否存在
# 若存在,则执行数据修改,反之新增数据
operation = Vocation.objects.filter(id=id).first()
# 数据验证
serializer = VocationSerializer(data=request.data)
if serializer.is_valid():
if operation:
serializer.update(operation, request.data)
else:
# 保存到数据库
serializer.save()
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
return Response(serializer.errors, status=404)
class vocationClass(APIView):
# GET请求
def get(self, request):
q = Vocation.objects.all().order_by('id')
# 分页查询,需要在settings.py设置REST_FRAMEWORK属性
pg = PageNumberPagination()
p = pg.paginate_queryset(queryset=q, request=request, view=self)
serializer = VocationSerializer(instance=p, many=True)
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
# POST请求
def post(self, request):
# 获取请求数据
id = request.data.get('id', 0)
operation = Vocation.objects.filter(id=id).first()
# 数据验证
serializer = VocationSerializer(data=request.data)
if serializer.is_valid():
if operation:
serializer.update(operation, request.data)
else:
# 保存到数据库
serializer.save()
# 返回对象Response由Django Rest Framework实现
return Response(serializer.data)
return Response(serializer.errors, status=404)