首页 > 其他分享 >drf之ModelSerializer

drf之ModelSerializer

时间:2023-04-23 12:33:25浏览次数:41  
标签:ModelSerializer name author models max publish length drf

目录

简介

与表做强关联,之后不需要再写create与update函数了
官网:https://www.django-rest-framework.org/api-guide/serializers/

语法

有多种写法,局部钩子与全局钩子是一样的

class 类名(serializers.ModelSerializer)
    # 固定写法,在类中再定义一个Meta
    class Meta:
        # 与表做强关联,左边的字段必须是model
        model = models.Book
        # 查询所有字段,但在显示外键时,会显示外键的字段id,并不是名。
        fields = '__all__'
        # 也可以使用fields指定字段,列表中进行注册
        fields = ['字段名1', '字段名2', ...]
        # 只读字段
        read_only_fields = ['字段名1', '字段名2']
        # 只写字段
        write_only_fields = ['字段名1', '字段名2']
        # 对字段定制限制,方法一:在Meta中定制
        extra_kwargs = {'字段名': {'max_length': 8, 'error_messages': {'max_length': '不能超过8个字符'}},
                        '字段名': {'read_only': True}
                        '字段名': {'write_only': True}}

    # 方法二:在Meta类外定义,且需要在Meta中的fields中进行注册,如:
    name = serializers.CharField(max_length=8, error_messages={'max_length': '不能超过8个字符'})
    price = serializers.CharField(max_length=8)
    publish = serializers.SerializerMethodField()
    def get_publish(self, obj):
        # 这里的obj其实就相当于Book.publish.name中的Book
        return {'name': obj.publish.name, 'phone': obj.publish.addr}
    # 多对多关系的字定义
    authors = serializers.SerializerMethodField()
    def get_authors(self, obj):
        author_list = []
        for author in obj.authors.all():
            author_list.append({'name': author.name, 'phone': author.phone})
        return author_list
  • 如下图,使用fields='__all__'后,前端获取到的是字段id号

示例

  • models.py
models.py
```python
from django.db import models


# Create your models here.
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    # 图书与出版社外键字段,一对多
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
    # 图书与作者外键字段,多对多
    authors = models.ManyToManyField(to='Author')

    @property
    def publish_detail(self):
        return {'name': self.publish.name, 'addr': self.publish.addr}

    @property
    def author_detail(self):
        author_list = []
        for author in self.authors.all():
            author_list.append({'name': author.name, 'phone': author.phone})
        return author_list


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.CharField(max_length=11)

使用Meta进行定义

  • serializer.py
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = ['name', 'price', 'publish_detail', 'author_detail', 'publish', 'authors']
        extra_kwargs = {'name': {'max_length': 8, 'error_messages': {'max_length': '不能超过8个字符'}},
                        'price': {'max_length': 8},
                        'publish_detail': {'read_only': True},  # 此字段是在models.py中定义的
                        'author_detail': {'read_only': True},   # 此字段是在models.py中定义的
                        'publish': {'write_only': True},
                        'authors': {'write_only': True}}

在Meta类外进行定义

  • serializer.py
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = ['name', 'price', 'publish', 'authors', 'publish_detail', 'author_detail']
        read_only_fields = ['publish_detail', 'author_detail']   # 此字段是在models.py中定义的
        write_only_fields = ['publish', 'authors']
    # 注意下面两个字段是写在Meta外的
    name = serializers.CharField(max_length=8, error_messages={'max_length': '不能超过8个字符'})
    price = serializers.CharField(max_length=8)

标签:ModelSerializer,name,author,models,max,publish,length,drf
From: https://www.cnblogs.com/smyz/p/17346203.html

相关文章

  • DRF的filter组件
    DRF的Filter组件如果某个API需要传递一些条件进行搜索,其实就在是URL后面通过GET传参即可,例如:/api/users?age=19&category=12在drf中filter组件可以支持条件搜索。1.自定义filter#models.pyfromdjango.dbimportmodelsclassRole(models.Model):"""角色表"""......
  • drf之多表关联反序列化保存read_only与write_only
    目录read_only与write_only示例假如前端传入了一组数据:{name:'赛尔达传说:王国之泪',price:350,publish:1,authors:[1,2]}如上:publish按id传入,authors也按id传入。read_only与write_onlyread_only用于序列化write_only用于反序列化这两个是字段参数示例#......
  • drf之定制返回样式SerializerMethodField与在表模型中定制
    SerializerMethodField定制返回的样式为person:{name:xxx,age:xxx}或person:[{name:xxx,age:xxx},{name:yyy,age:yyy}...]等,就可以使用到SerializerMethodField语法在序列化类中进行定义序列化字段名=serializers.SerializerMethodField()defget_序列化字段名(self......
  • DRF的权限组件(源码分析)
    DRF的权限组件(源码分析)1.创建用户表fromdjango.dbimportmodels#Createyourmodelshere.classUserInfo(models.Model):role_choice=((1,'CEO'),(2,'CTO'),(3,'CFO'))role=models.SmallIntegerField(verbose_name='类型&......
  • DRF之request
    1.request.datapost请求内的数据都放在了request.data2.request.query_parmeget请求内携带的参数都放在了request.query_parms3.request.FILESdefFILES(self):#LeavethisonealoneforbackwardscompatwithDjango'srequest.FILES#Dif......
  • DRF之权限
    1.基于BasePermission自定义权限1.1  基于fromrest_framework.permissionsimportBasePermission实现权限classApp01Permission(BasePermission):defhas_permission(self,request,view):''':paramrequest::paramview:......
  • 使用drf的序列化类实现增删改查接口
    目录什么是DRF安装DRF基于原生创建五个接口基于rest_framework的增删改查查询多条数据流程创建表创建序列化类创建视图类增加路由查询单条数据序列化类不变视图类定义对象新增路由新增一条数据序列化类视图类修改一条数据视图类删除一条数据序列化之钩子函数校验局部钩子全局钩子......
  • django-rest-framework-从零开始-10-自动生成接口文档drf-spectacular的使用
    django-rest-framework-从零开始-10-自动生成接口文档drf-spectacular的使用1、前言我们和前端对接,或者其他同事对接,需要一个API文档,这里对于drf项目,推荐使用drf-spectac......
  • django-rest-framework-从零开始-3-序列化类ModelSerializer的使用
    django-rest-framework-从零开始-3-序列化类ModelSerializer的使用1、前言我们之前提到创建序列化类,需要继承serializers.Serializer类,然后映射模型类的字段,然后重写crea......
  • django-rest-framework-从零开始-3-序列化类ModelSerializer的使用
    django-rest-framework-从零开始-3-序列化类ModelSerializer的使用1、前言我们之前提到创建序列化类,需要继承serializers.Serializer类,然后映射模型类的字段,然后重写crea......