根据带外键的模型类定义序列化器的方法

根据下面英雄模型类定义序列化器

#定义英雄模型类
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()

显示结构如下

 

posted @ 2020-09-16 23:22  亦木121  阅读(218)  评论(0)    收藏  举报