Django Rest_framework 5(Django之serializer-主从表数据关联查询)

models.py

数据库:一对多。它指的是两个表之间的关系,一指的是主表中的一条数据,多指的是从表中的多条数据。
#学生和班级两个模型,班级->学生(一对多)
class Classes(models.Model):
    classname=models.CharField(max_length=50,verbose_name="班级")
    school=models.CharField(max_length=50,verbose_name="学校")
    admission_date=models.DateField(auto_now=True,verbose_name="入学时间")

    def __str__(self):
        return self.classname

    class Meta:
        db_table="classes"

class Students(models.Model):
    name=models.CharField(max_length=50,verbose_name="学生姓名")
    gender=models.CharField(max_length=30,choices=(("boy","boy"),('girl','girl')),default='boy',verbose_name="性别")	      sclass=models.ForeignKey(to=Classes,on_delete=models.CASCADE,verbose_name="学生班级")


    def __str__(self):
        return self.name

    class Meta:
        db_table="students"
主从表数据关联查询
1.PrimaryKeyRelatedField:

在子表的所在子应用的模型序列化器类中定义PrimaryKeyRelatedField,返回主表的主键id,类属性名和主表名一致

  • queryset 用于在验证字段输入时模型实例查找。 关系必须明确设置 queryset,或设置 read_only = True
  • many 如果是对应多个的关系,就设置为 True
  • allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False
  • pk_field 设置为一个字段以控制主键值的序列化/反序列化。例如,pk_field = UUIDField(format =‘hex’) 将UUID主键序列化为紧凑的十六进制表示
  • read_only=True 这个值只返回给前端不让前端提交,前端只有读的权利
    write_only=True 这个值让前端只会提交,不会再返回给前端,前端只有写的权利
修改外键字段名称:在从表的模型类对象中,给定义的外键对象设置一个属性:related_name
#若模型在定义外键时使用了related_name="students",则可以使用studens替代students_set

students_set=serializers.PrimaryKeyRelatedField(read_only=True,many=True)
#这里的外键与直接写一个类不同的是,只会将主键(goods_id)返回给前端,而不是返回goods中的所有字段。

在这里插入图片描述

2.StringRelatedField

在子表的所在子应用的模型序列化器类中定义StringRelatedField,返回主表对应对象的__str__方法的结果,str__方法在字表的数据库模型类中定义(python2中使用的是__unicode)

students_set=serializers.StringRelatedField(read_only=True,many=True)

在这里插入图片描述

3.SlugRelatedField

在子表的所在子应用的模型序列化器类中定义SlugRelatedField,返回主表的某一个字段值

  • slug_field 应该用于表示目标的字段。这应该是唯一标识任何给定实例的字段。例如 username 。这是必选参数
  • queryset 验证字段输入时用于模型实例查询的查询器。 关系必须明确设置 queryset,或设置 read_only = True
  • many 如果应用于多对多关系,则应将此参数设置为 True
  • allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False
students_set = serializers.SlugRelatedField(many=True,read_only=True,slug_field='gender')

在这里插入图片描述

4.HyperlinkedRelatedField

默认通过主键查询,关系对象显示为一个url
url接受单独的URL关键字参数,利用lookup_field和lookup_url_kwarg设置
url中包含一个单独的主键或者标签参数(pk)
如果需要使用更复杂的超链接字段,需要自己自定义参数:

  • view_name 用作关系目标的视图名称。如果使用的是标准路由器类,那么它的格式为 -detail 的字符串

  • queryset 验证字段输入时用于模型实例查询的查询器。关系必须明确设置 queryset,或设置 read_only = True

  • many 如果应用于多对多关系,则应将此参数设置为 True

  • allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False

  • lookup_field 应该用于查找的目标上的字段。应该对应于引用视图上的 URL 关键字参数。默认值为 pk

  • lookup_url_kwarg 与查找字段对应的 URL conf 中定义的关键字参数的名称。默认使用与 lookup_field 相同的值

  • format 如果使用 format 后缀,超链接字段将对目标使用相同的 format 后缀,除非使用 format 参数进行覆盖。

    注意事项:

      # 在serializer的方法中使用Serializer的时候,他会检察上下文中有没有包含request,
      # 如果有,那么在返回的图片url中会自动加上域名 http://....
      # 如果没有,那么返回的url只会加上路径 /media/goods/images/......
      
      使用此字段时,主表从表序列化都需要添加context={‘request’:request}
    	序列化器中添加context={'request': self.context['request']}
    
students_set = serializers.HyperlinkedRelatedField(read_only=True, many=True, view_name='classes:mstudent',lookup_field='id')

在这里插入图片描述

5.HyperlinkedIdentityField

自定义超链接字段名,默认为‘url’,始终为只读

  • view_name 应该用作关系目标的视图名称。如果您使用的是标准路由器类,则它将是格式为 -detail的字符串。必选参数
  • lookup_field 应该用于查找的目标上的字段。应该对应于引用视图上的 URL 关键字参数。默认值为 pk
  • lookup_url_kwarg 与查找字段对应的 URL conf 中定义的关键字参数的名称。默认使用与 lookup_field 相同的值
  • format 如果使用 format 后缀,超链接字段将对目标使用相同的 format 后缀,除非使用 format 参数进行覆盖
class AlbumSerializer(serializers.HyperlinkedModelSerializer):
    track_listing = serializers.HyperlinkedIdentityField(view_name='track-list')

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'track_listing')

{
    'album_name': 'The Eraser',
    'artist': 'Thom Yorke',
    'track_listing': 'http://www.example.com/api/track_list/12/',
}
6.展示主表的详细信息

在从表的序列化器类中实例化一个主表的序列化器类,因为外键字段类和序列化器类最终都继承了rest_framework.fields.Field类,他们属于同级关系,因此可以将一个序列化器类的对象创建为另一个关联序列化器类的类属性,如果需要支持可写操作,那么就必须在序列化类中重写create() and/or update()

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration')

# 注意:如果和对象关联的对象有多个,在定义嵌套序列化的字段时,需要指明many=True
class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    ### 序列化嵌套的字段tracks需要添加到下面的fields中

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')
        
{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值