首页 > 其他分享 >drf之定制返回样式SerializerMethodField与在表模型中定制

drf之定制返回样式SerializerMethodField与在表模型中定制

时间:2023-04-21 16:11:30浏览次数:34  
标签:serializers name models max length SerializerMethodField CharField 定制 drf

SerializerMethodField

定制返回的样式为person:{name:xxx,age:xxx}或person:[{name:xxx, age:xxx},{name:yyy, age:yyy}...]等,就可以使用到SerializerMethodField

语法

  • 在序列化类中进行定义
    序列化字段名 = serializers.SerializerMethodField()
    def get_序列化字段名(self, obj) 这里的obj其实就是models.py中定义的表名
    return {} 最后return什么,前端就收到什么

示例

  • models.py中定义表
from django.db import models

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')

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)

serializer.py中定义序列化类

class BookSerializers(serializers.Serializer):
    game_name = serializers.CharField(source='name')
    game_price = serializers.CharField(source='price')

    publish = serializers.SerializerMethodField()
    # obj其实就是序列化对象所在的表的表名
    # 定义函数时必须是  get_字段名 ,这里面的字段名指的是SerializerMethodField所在的字段
    # get_字段名 中的字段名是什么,前端拿到的字段名就是什么
    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
  • 如图查看返回结果的样式:

表模型中定制

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  # @property可以不加
    def publish_detail(self): # 定义的名字需要与serializer.py中定义的序列化类中的名字相同
        return {'name': self.publish.name, 'addr': self.publish.addr}

    @property
    def authors_detail(self): # 定义的名字需要与serializer.py中定义的序列化类中的名字相同
        list = []
        for author in self.authors.all():
            list.append({'name': author.name, 'phone': author.phone})
        return 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)

serializer.py

from rest_framework import serializers

class BookSerializers(serializers.Serializer):
    game_name = serializers.CharField(source='name')
    game_price = serializers.CharField(source='price')
    # 接收一个字典则使用DictField,字段名需要与models.py中定义的函数一致
    publish_detail = serializers.DictField()
    # 接收一个列表,则使用ListField,字段名需要与models.py中定义的函数一致
    authors_detail = serializers.ListField()

标签:serializers,name,models,max,length,SerializerMethodField,CharField,定制,drf
From: https://www.cnblogs.com/smyz/p/17340368.html

相关文章

  • DRF的权限组件(源码分析)
    DRF的权限组件(源码分析)1.创建用户表fromdjango.dbimportmodels#Createyourmodelshere.classUserInfo(models.Model):role_choice=((1,'CEO'),(2,'CTO'),(3,'CFO'))role=models.SmallIntegerField(verbose_name='类型&......
  • renpyGUI定制确认界面
    项目创建后默认的confirm界面代码,在screen.rpy文件中:screenconfirm(message,yes_action,no_action):##显示此界面时,确保其他界面无法输入。modalTruezorder200style_prefix"confirm"add"gui/overlay/confirm.png"frame:vb......
  • 定制的视频监控球机接入EasyCVR后通道不显示的原因排查
    EasyCVR基于云边端智能协同,具有强大的数据接入、处理及分发能力,平台可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等(具体见下图)。有用户反馈,将某品牌的定制款监控摄像头球机接入EasyCVR平台后,通道不显示......
  • DRF之request
    1.request.datapost请求内的数据都放在了request.data2.request.query_parmeget请求内携带的参数都放在了request.query_parms3.request.FILESdefFILES(self):#LeavethisonealoneforbackwardscompatwithDjango'srequest.FILES#Dif......
  • 知识付费小程序源码资源共享会员积分广告小程序定制开发源码二开
    资源分享可以在后台添加各种资源,如风景,写真,cos,壁纸,各种链接。后台可以设置这些资源如何观看,免费,看广告,VIP广告设置可以添加各种广告,可以在广告设置里设置好广告id还有广告应用场景。VIP设置管理员可以在后台更改用户的VIP设置,也可以设置卡密,让用户自行解锁vip,也可以设置积分,让用户......
  • DRF之权限
    1.基于BasePermission自定义权限1.1  基于fromrest_framework.permissionsimportBasePermission实现权限classApp01Permission(BasePermission):defhas_permission(self,request,view):''':paramrequest::paramview:......
  • 定制开发系统软件必须讲究的特点,让你万事亨通
     如今选择定制开发一个系统软件的人是越来越多,但是能够开发成功的人却比较少,关键在于有没有讲究一些特点。今天名锐讯动为大家介绍定制开发系统软件必须讲究的特点。 1.可用性。所谓的可用性指的就是系统软件是否能够方便实用操作,如果系统软件不存在这个特点,那么用户选择使......
  • 定制网站设计要满足什么要求?三个要求不可违背
     不同于普通的网站设计,定制网站设计可以根据企业的自身需求进行定制开发,所以它也成为当下企业倾向于选择的一种设计方式。但是这种设计方式需要满足一些要求,那么定制网站设计要满足什么要求?下面名锐讯动为大家讲述三个要求不可违背。 1.浏览体验好。根据调查显示,大多数用户......
  • 定制开发软件系统要清楚哪些核心?这些核心要记住
     许多企业商家不知道的是,自己在找开发商定制一个软件系统的时候要清楚一些核心,否则会降低自己开发的成功率。那么定制开发软件系统要清楚哪些核心?今天名锐讯动为大家总结这些核心要记住。 1.功能需求。众所周知,定制开发一个软件系统是需要围绕功能需求而实现的。如果没有具......
  • 定制开发系统平台能够具备的亮点,让企业蒸蒸日上
     分析市场上迅速发展的企业我们就会发现这些企业都曾经找开发商帮助自己定制开发一个系统平台,给自身企业的发展带来很大的助力。下面名锐讯动为大家介绍定制开发系统平台能够具备的亮点。 1.针对性强。由于系统平台是开发商根据企业提供的自身需求进行量身定制,所以系统平台体......