drf使用1(序列化,视图)
介绍
drf框架是基于Django框架,用于快速构建Web RESTful API的工具官方文档:https://www.django-rest-framework.org/
安装:
pip install djangorestframework
快速使用 1. 搭建模型
from django.db import modelsclass BookModel(models.Model):
"""
书籍模型
"""
name = models.CharField(max_length=200, verbose_name='书籍名称')
book_info = models.TextField(max_length=1024, default=None, blank=True, verbose_name='书籍介绍')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')class Meta:
db_table = 'tb_book'
verbose_name = '书籍信息'
verbose_name_plural = verbose_nameclass HeroModel(models.Model):
"""
书籍人物模型
"""
name = models.CharField(max_length=200, verbose_name='英雄姓名')
hero_info = models.TextField(max_length=1024, default=None, blank=True, verbose_name='英雄介绍')
join_time = models.DateTimeField(auto_now_add=True, verbose_name='加入时间')
book_name = models.ForeignKey('BookModel', on_delete=models.CASCADE, related_name='book_hero', verbose_name='所属书籍')class Meta:
db_table = 'tb_hero'
verbose_name = '书籍人物信息'
verbose_name_plural = verbose_name
- 注意外键对应关系
INSTALLED_APPS = [
......
'rest_framework',
]
3. 序列化器serializer
# serializers.pyfrom rest_framework import serializers
from .models import BookModel, HeroModelclass BookSerializer(serializers.ModelSerializer):
class Meta:
model = BookModel
fields = '__all__'
4. 视图views
# views.pyfrom rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from .serializers import BookSerializer
from .models import BookModelclass Books(GenericViewSet, ListModelMixin, CreateModelMixin):
queryset = BookModel.objects.all()
serializer_class = BookSerializer
5. 路由自动注册DefaultRouter
from rest_framework.routers import DefaultRouter
from . import viewsapp_name = 'book'
urlpatterns = []router = DefaultRouter()
router.register('book', views.Books, basename='book')
urlpatterns += router.urls
6. 效果显示
文章图片
文章图片
序列化关联返回serializers 1. 返回关联外键的ID:PrimaryKeyRelatedField
class BookSerializer(serializers.ModelSerializer):
book_hero = serializers.PrimaryKeyRelatedField(read_only=True, many=True)class Meta:
model = BookModel
fields = ['name', 'book_info', 'book_hero', 'create_time']
文章图片
2. 返回关联字段模型的__str__方法的值:StringRelatedField
class BookSerializer(serializers.ModelSerializer):
book_hero = serializers.StringRelatedField(read_only=True, many=True)class Meta:
model = BookModel
fields = ['name', 'book_info', 'book_hero', 'create_time']
文章图片
3. 嵌套序列化器的使用
class BookSerializer(serializers.ModelSerializer):
# Heroserializer应先于本序列化器前定义
book_hero = HeroSerializer(many=True)class Meta:
model = BookModel
fields = ['name', 'book_info', 'book_hero', 'create_time']
文章图片
4. read_only和write_only
read_only=True
:不参与反序列化验证过程,只参与序列化返回过程write_only
: 不参与序列化返回过程,只参与验证过程
- 单一字段验证
class BookSerializer(serializers.ModelSerializer): book_hero = serializers.StringRelatedField(many=True, read_only=True)class Meta: model = BookModel fields = ['name', 'book_info', 'book_hero', 'create_time']def validate_name(self, value): """ 验证书名不能是python """ if value =https://www.it610.com/article/='python': raise serializers.ValidationError('书名不能是python') return value
- 多字段验证
def validate(self, attrs): if attrs['name'] == 'python' or attrs['book_info'] == 'python': raise serializers.ValidationError('书名或info不能是python') return attrs
from rest_framework.decorators import actionclass Books(GenericViewSet, ListModelMixin, CreateModelMixin):
queryset = BookModel.objects.all()
serializer_class = BookSerializer@action(methods=['get'], detail=True)
def hello(self, request, pk):
res = 'hello' + str(pk)
return Response(res)
http://127.0.0.1:8000/book/1/hello/
【drf使用1(序列化,视图)】
文章图片
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小