REST framework -- seralizer中添加额外字段的方法以及外键的处理

#方法一:  修改model
class Animal(models.Model):
    name = models.CharField(max_length=50, default=‘‘)
    type = models.CharField(max_length=50, default=‘‘)
    country = models.ForeignKey(Country, blank=True, null=True)

    @property
    def country_area(self):
        return self.country.area

class AnimalSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)
    type = serializers.CharField(max_length=50)
    country = serializers.PrimaryKeyRelatedField(read_only=True)
    country_area = serializers.FloatField(required=False, source=‘country_area’)

#方法二: 不修改model  直接使用SerializerMethodField(method_name=None)字段

#SerializerMethodFiel是一个read-only字段
#当不指定其method_name时,默认为get_<field_name>
#如果使用ModelSerializer并指定字段时,要包含此时定义的字段

class AnimalSerializer(serializers.ModelSerializer):
    country_area = serializers.SerializerMethodField()

    class Meta:
        model = Animal
        fields = (‘id‘, ‘name‘, ‘type‘,‘country‘,‘country_area‘)

    def get_country_area(self, obj):
        return obj.country.area 

#方法三:可以在前端显示时多显示一个字段,后端获取到值之后先从validated_data中去掉再进行接下来的处理
class ParentsSerializer(serializers.ModelSerializer):
    kids_id = serializers.IntegerField(source=‘my_field‘)

    def create(self, validated_data):
        kids_id = validated_data.pop(‘my_field‘)
序列化时外键关系的处理:
#第一种:
class KidsSerializer(serializers.ModelSerializer):

    class Meta:
        model = Kids
        fields = ‘__all__‘

#访问时默认显示外键id ,创建时传id

#第二种:
class KidsSerializer(serializers.ModelSerializer):

    class Meta:
        model = Kids
        fields = ‘__all__‘
        depth = 1
#访问时显示外键字段的所有信息,但是只读的,不可编辑,即新建时不能传值

#第三种:
class KidsSerializer(serializers.ModelSerializer):
    grade = serializers.SlugRelatedField(queryset=Grade.objects.all(), slug_field=‘id‘)

    class Meta:
        model = Kids
        fields = ‘__all__‘

#访问时显示id/其他,新建时传id值/其他值

#序列化时反向关联的字段的处理    

class GradeFinanceSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=True)
    name = serializers.CharField(read_only=True)

class FinancePlanSerializer(serializers.ModelSerializer):
    grades = GradeFinanceSerializer(many=True)        

#访问时只显示定制的字段  新建时以列表形式传值    

#字段类型在数据库中为枚举的字段显示问题: get_XXX_display
level = serializers.CharField(source=‘get_level_display‘)
时间: 2024-11-07 20:20:12

REST framework -- seralizer中添加额外字段的方法以及外键的处理的相关文章

在数据表中添加一个字段的SQL语句怎么写

如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: alter table [表名] add 字段名 smallint default 0 增加数字字段,整型,缺省值为0 alter table [表名] add 字段名 int default 0 增加数字字段,长整型,缺省值为0

top100的数据中添加序号字段

方法一,用row_number 分组为1,在组内编号排序. 代码 select row_num(a.num) num,       event_query,       search_numfrom(select  '1'  as num,        event_query,        search_numfrom    (        SELECT event_query            ,count(1) AS search_num           FROM defaul

yii2中添加验证码的实现方法

本文实例讲述了yii2中添加验证码的实现方法.分享给大家供大家参考,具体如下: 首先,在模型中添加验证码字段: ? 1 2 3 public function rules(){ return ['verifyCode', 'captcha'], } 其次,可以在函数attributeLabels中添加前台页面中验证码的字段名称: ? 1 2 3 public function atrributeLabels(){ return ['verifyCode'=>'Verification Code'

VS中添加预处理宏的方法

VS中添加预处理宏的方法 除了在.c及.h中添加宏定义之外,还可以采用如下方法添加宏定义: 1.若只需要定义一个宏(如#define DEBUG),可以右键点击工程-->属性-->c/c++-->预处理器-->预处理器定义,点击下拉框中的编辑,输入想要定义的宏: 2.如果还需要定义宏的内容(如#define inline __inline),可以右键点击工程-->属性-->c/c++-->命令行,在其它选项中输入如下内容: /D"inline"

在html中添加script脚本的方法和注意事项

在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script>脚本的方法: 1.可以直接将javascript代码添加到html中 <script type="text/javascript"> //javascritp代码 </script> 当解释器嵌入<script>代码时,html页面的处理也会被暂时

网页中添加下划线的方法汇总及优缺点

本文主要介绍了添加下划线样式的几乎所有方法,并且比较了每一种方法的优缺点.没想到之前一直没有注意的下划线还有这么多玄机奥秘! 本文由 nzbin 翻译,艾凌风 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/89425/ 有很多种添加下划线样式的方法.可能你还记得< Crafting link underlines on Medium >这篇文章.Medium 并没有尝试特殊的方法,只是想创建一个漂亮的看起来正常的下划

Qt中添加背景图片的方法

Qt中添加背景图片的方法 1. QPalette的方法 #include <QApplication>#include <QtGui> int main(int argc, char *argv[]){    QApplication app(argc,argv);        QFrame *frame = new QFrame;    frame->resize(400,700);    QPixmap pixmap("images/frame.png&quo

详解VMware 虚拟机中添加新硬盘的方法

一.VMware新增磁盘的设置步骤 (建议:在设置虚拟的时候,不要运行虚拟机的系统,不然添加了新的虚拟磁盘则要重启虚拟机) 1.选择“VM”----“设置”并打开,将光标定位在“硬盘(SCSI)”这一选项,然后点击下方的“添加”按钮 2.点击下一步,执行下一个步骤 3.选择磁盘类型 4.根据提示,创建一个虚拟的磁盘,并点击下一步 5.设置磁盘大小,点击下一步 6.选择存储位置,最后点击完成 以下是对虚拟机中Linux和widows中对于新的虚拟磁盘的挂载的方式的介绍 二.虚拟机中windows对

MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结

1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter table student add constraint PK_studentId primaryKey(studentId); 3,为当前已有的表中的字段设置为外键 alter table student add constraint FK_teacherId_studentInfo forei