内容详细
1.1 models
from django.db import models
# 4张表
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author')
def __str__(self):
return self.name
@property
def publish_detail(self):
return {'name': self.publish.name, 'addr': self.publish.city}
@property
def author_list(self):
l = []
print(self.authors.all())
for author in self.authors.all():
print(author.author_detail)
l.append({'name': author.name,'age':author.age,'addr':author.author_detail.addr})
return l
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail', on_delete=models.CASCADE)
# OneToOneField 就是ForeignKey+unique=True
class AuthorDatail(models.Model):
telephone = models.BigIntegerField()
# birthday = models.DateField()
addr = models.CharField(max_length=64)
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
1.2 serializer
from .models import *
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
class AuthorSerialzier(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
from .models import *
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'name', 'price', 'authors', 'publish', 'publish_detail', 'author_list']
# depth=1 # 尽量不要用,关联表一层全部取出来
extra_kwargs = {
'publish': {'write_only': True},
'authors': {'write_only': True},
}
# 定制序列化的字段(2种)--》表模型中
class AuthorSerialzier(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
class AuthorDetailSerialzier(serializers.ModelSerializer):
class Meta:
model = AuthorDatail
fields = '__all__'
class PublishSerialzier(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
class AuthorDetailSerialzier(serializers.ModelSerializer):
class Meta:
model = AuthorDatail
fields = '__all__'
class PublishSerialzier(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'
1.3 views
class BookView(APIView):
def get(self, request):
book_list = Book.objects.all()
ser = BookSerializer(instance=book_list, many=True)
return Response(ser.data)
def post(self, request):
ser = BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({"code": 100, 'msg': '新增成功', 'data': ser.data})
return Response({"code": 101, 'msg': '新增出错', 'err': ser.errors})
class BookDetailView(APIView):
def get(self, request, pk):
book = Book.objects.all().filter(pk=pk).first()
ser = BookSerializer(instance=book)
return Response(ser.data)
def put(self, request, pk):
book = Book.objects.all().filter(pk=pk).first()
ser = BookSerializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response({"code": 100, 'msg': '修改成功', 'data': ser.data})
return Response({"code": 101, 'msg': '修改出错', 'err': ser.errors})
def delete(self, request, pk):
Book.objects.filter(pk=pk).delete()
return Response({"code": 100, 'msg': '删除成功'})
1.4 urls
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', views.BookView.as_view()),
path('books/<int:pk>', views.BookDetailView.as_view()),
]
2 请求与响应
2.1 请求
# Request 类的对象---》新的request对象
from rest_framework.request import Request
# 记住的
__getattr__
request.data
request.query_parmas--->self._request.GET-->restful规范里,请求地址中带过滤(查询)条件---》get请求地址中提交的
数据在GET中,---》query_parmas:查询参数
# 了解--->默认情况下,可以解析 urlencoded,formdata,json
-如果我们写了一个接口,想只能处理json格式,或者只能处理formdata
# 局部配置
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class PublishView(APIView):
# 局部使用,只针对当前视图类有效,只想处理json格式
parser_classes = [JSONParser]
# 全局配置---》配置文件--->所有接口都只能解析json格式
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
],
}
# 全局配置解析json,局部某个视图函数想能解析formdata格式
视图类中配置一下即可---》局部配置
-如果局部配置如下,会怎么样
parser_classes = [] # 所有格式都补不能解析了
# 使用顺序:我们没有配置,也有默认配置:3个都能解析
drf有默认配置(最后)----》项目配置文件的配置(其次)----》视图类中配的(优先用)
drf的默认配置:from rest_framework import settings
# 总结:一般情况下,都使用默认即可,不用配置
2.2 响应
Respone:from rest_framework.response import Response
# 属性
data=None, # 字符串,字典,列表--》给http响应body体中内容-->response对象中取出处理
status=None, # 响应状态码:1xx,2xx,3xx,默认是200
from rest_framework.status import HTTP_201_CREATED
Response(ser.data,status=HTTP_201_CREATED)
headers=None, # 响应头 字典
---了解---
template_name=None, # 模板名字(不用),用浏览器访问时,可以改
exception=False, # 异常处理
content_type=None # 响应编码格式
# 响应格式---》跟解析格式
# 局部设置
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookDetailView(APIView):
renderer_classes = [JSONRenderer,]
# 全局设置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
3 视图组件
# APIView
from rest_framework.views import APIView
-类属性
-renderer_classes,parser_classes。。。
-get方法,post方法,delete方法写法跟之前的View一样,只不过request对象变成了新的request丢下
-比之前的View多了三大认证和全局异常处理
# GenericAPIView 继承了APIView ,多了属性和方法
from rest_framework.generics import GenericAPIView
-属性(先记两个)
-queryset = None
-serializer_class = None
-方法
-get_queryset
-get_object
-get_serializer
# 5个视图扩展类(不是视图类,没有集成APIView,需要配合GenericAPIView)
from rest_framework.mixins
CreateModelMixin,
ListModelMixin,
DestroyModelMixin,
RetrieveModelMixin,
UpdateModelMixin
# 9个视图子类
from rest_framework.generics
CreateAPIView,
ListAPIView,
DestroyAPIView,
RetrieveAPIView,
UpdateAPIView
ListCreateAPIView,
RetrieveUpdateAPIView,
RetrieveUpdateDestroyAPIView,
RetrieveDestroyAPIView
# 视图集
from rest_framework.viewsets
# 两个视图类
ModelViewSet,ReadOnlyModelViewSet
# 视图类
ViewSet,GenericViewSet,
# 魔法类
ViewSetMixin