根据带外键的模型类定义序列化器的方法
根据下面英雄模型类定义序列化器
#定义英雄模型类 class HeroInfo(models.Model): GENDER_CHOICES = ( (0,'female'), (1,'male') ) 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='描述信息') #null=True? hbook = models.ForeignKey(BookInfo,on_delete=models.CASCADE,verbose_name='图书') #外键 on_delete=models.CASCADE? is_delete = models.BooleanField(default=False,verbose_name='逻辑删除') class Meta: db_table = 'tb_heros' verbose_name = '英雄' verbose_name_plural = verbose_name def __str__(self): return self.hname
下面是定义的序列化器
#定义英雄模型的序列化器,注意该模型含有外键 class HeroInfoserializer(serializers.Serializer): GENDER_CHOICES = ( (0,'female'), (1,'male') ) hname = serializers.CharField(max_length=20,label='名称') hgender = serializers.ChoiceField(choices=GENDER_CHOICES,required=False,label='性别') #required=False? hcomment = serializers.CharField(max_length=200,allow_null=True,label='描述信息',required=False) #1,关联书籍外键,主键 hbook = serializers.PrimaryKeyRelatedField(read_only=True)
注意:
1.必须加read_only=True
如果写成
hbook = serializers.PrimaryKeyRelatedField()
会报如下错误

2.ChoiceField?? 模型类的字段是SmallIntegerField
3.结果书籍以id表示

4.另外一种写法
hbook = serializers.PrimaryKeyRelatedField(queryset=BookInfo.objects.all())
queryset实际上是一个视图集,将所有书籍都放入,会自动根据pk去找。结果跟上面是一样的
------------------------------------------------------------------------------------------------------------------------------------------
以上是关联书籍的主键 ,我们也可以关联主键的名字 ,通过模型类的__str__方法返回值。代码如下
Hbook = serializers.StringRelatedField(read_only=True)
结果:
---------------------------------------------------------------------------------------------------------------------------------------------
也可以直接关联书籍的序列化器
hbook = BookInfoSerializer()
显示结构如下


浙公网安备 33010602011771号