admin管理员组

文章数量:1130349

DRF

from django.db import models# Create your models here.class BookInfo(models.Model):btitle = models.CharField(max_length=20, verbose_name='名称')bpub_date = models.DateField(verbose_name='发布时间')bcomment = models.IntegerField(default=0, verbose_name='评论量')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'tb_books'  # 指明数据表名verbose_name = '图书'  # 在admin站点中显示的名称verbose_name_plural = 'verbose_name' # 显示复数的名称def __str__(self):return self.btitle# 定义英雄模型类HeroInfo
class HeroInfo(models.Model):GENDER_CHOICES = ((0, 'male'),(1, 'female'))hname = models.CharField(max_length=20, verbose_name='名称')hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0,verbose_name=' 性别')hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'tb_heros'verbose_name = '英雄'verbose_name_plural = verbose_namedef __str__(self):return self.hname

INSERT into tb_heros(hname,hgender,hbook_id,hcomment,is_delete) VALUES
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',1,1,'打狗棍',0),
('黄药师',1,2,'弹指',0),
('欧阳锋',1,3,'蛤蟆功',0),
('乔峰',1,3,'降龙十八掌',0),
('段誉',1,4,'六脉神剑',0),
('虚竹',1,4,'天上',0)

以上为造的数据。

一、一对多的形式

book表查询的时候返回英雄表的里数据,但是book表里面没有外键,这个时候在book序列化器里新增一个,英雄表的小写类名加set的形式,例如heroinfo_set。

有三种返回嵌套的形式

1、返回关联的英雄id PrimaryKeyRelatedField

2、返回关联英雄的模型类的str方法值

3、想返回英雄类里的其他字段值,需要再定义一个英雄的序列化器,需要注意的是,嵌套的序列化器,必须先于这个序列化器,否则代码加载的时候,找不到这个新建序列化器就报错了

还有如果在英雄类的里外键字段,有一个related_name='hero' ,就可以用hero 代替heroinfo了,也是一种方法。

from rest_framework import serializersclass HeroSerializer(serializers.Serializer):# 英雄序列化器hname = serializers.CharField()hcomment = serializers.CharField()# 多对一的场景# hbook = serializers.PrimaryKeyRelatedField()hbook = serializers.StringRelatedField()# 自定义序列化器,本质就是一个类
class BookSerializer(serializers.Serializer):# 序列化返回的字段btitle = serializers.CharField()bpub_date = serializers.DateField()bcomment = serializers.IntegerField()# 一对多的场景,总共有三种返回嵌套的形式:# 1、返回关联的英雄id PrimaryKeyRelatedField# heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)# 2、返回关联英雄的模型类的str方法值# heroinfo_set = serializers.StringRelatedField(read_only=True, many=True)# 3、想返回英雄类里的其他字段值,需要再定义一个英雄的序列化器,需要注意的是,嵌套的序列化器,# 必须先于这个序列化器,否则代码加载的时候,找不到这个新建序列化器就报错了heroinfo_set = HeroSerializer(many=True)

二、多对一的形式

多对一的形式,这个就好比英雄类的数据返回要带上图书的数据,英雄类里面有一个外键,可以直接使用外键形式关联

hbook = serializers.PrimaryKeyRelatedField()

hbook = serializers.StringRelatedField()

总结:

 

 

DRF

from django.db import models# Create your models here.class BookInfo(models.Model):btitle = models.CharField(max_length=20, verbose_name='名称')bpub_date = models.DateField(verbose_name='发布时间')bcomment = models.IntegerField(default=0, verbose_name='评论量')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'tb_books'  # 指明数据表名verbose_name = '图书'  # 在admin站点中显示的名称verbose_name_plural = 'verbose_name' # 显示复数的名称def __str__(self):return self.btitle# 定义英雄模型类HeroInfo
class HeroInfo(models.Model):GENDER_CHOICES = ((0, 'male'),(1, 'female'))hname = models.CharField(max_length=20, verbose_name='名称')hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0,verbose_name=' 性别')hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'tb_heros'verbose_name = '英雄'verbose_name_plural = verbose_namedef __str__(self):return self.hname

INSERT into tb_heros(hname,hgender,hbook_id,hcomment,is_delete) VALUES
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',1,1,'打狗棍',0),
('黄药师',1,2,'弹指',0),
('欧阳锋',1,3,'蛤蟆功',0),
('乔峰',1,3,'降龙十八掌',0),
('段誉',1,4,'六脉神剑',0),
('虚竹',1,4,'天上',0)

以上为造的数据。

一、一对多的形式

book表查询的时候返回英雄表的里数据,但是book表里面没有外键,这个时候在book序列化器里新增一个,英雄表的小写类名加set的形式,例如heroinfo_set。

有三种返回嵌套的形式

1、返回关联的英雄id PrimaryKeyRelatedField

2、返回关联英雄的模型类的str方法值

3、想返回英雄类里的其他字段值,需要再定义一个英雄的序列化器,需要注意的是,嵌套的序列化器,必须先于这个序列化器,否则代码加载的时候,找不到这个新建序列化器就报错了

还有如果在英雄类的里外键字段,有一个related_name='hero' ,就可以用hero 代替heroinfo了,也是一种方法。

from rest_framework import serializersclass HeroSerializer(serializers.Serializer):# 英雄序列化器hname = serializers.CharField()hcomment = serializers.CharField()# 多对一的场景# hbook = serializers.PrimaryKeyRelatedField()hbook = serializers.StringRelatedField()# 自定义序列化器,本质就是一个类
class BookSerializer(serializers.Serializer):# 序列化返回的字段btitle = serializers.CharField()bpub_date = serializers.DateField()bcomment = serializers.IntegerField()# 一对多的场景,总共有三种返回嵌套的形式:# 1、返回关联的英雄id PrimaryKeyRelatedField# heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)# 2、返回关联英雄的模型类的str方法值# heroinfo_set = serializers.StringRelatedField(read_only=True, many=True)# 3、想返回英雄类里的其他字段值,需要再定义一个英雄的序列化器,需要注意的是,嵌套的序列化器,# 必须先于这个序列化器,否则代码加载的时候,找不到这个新建序列化器就报错了heroinfo_set = HeroSerializer(many=True)

二、多对一的形式

多对一的形式,这个就好比英雄类的数据返回要带上图书的数据,英雄类里面有一个外键,可以直接使用外键形式关联

hbook = serializers.PrimaryKeyRelatedField()

hbook = serializers.StringRelatedField()

总结:

 

 

本文标签: DRF