Rest Framework 串行器关系

关系字段用于表示模型关系。它们可以应用到ForeignKey,ManyToManyField和OneToOneField关系,以及扭转的关系,以及自定义关系等GenericForeignKey。

下面我们就一对多关系为例:

MODEL:
		class Kuaidi(models.Model):
		    name=models.CharField(max_length=40,verbose_name='快递公司')
		    daimai=models.CharField(max_length=11,unique=True,verbose_name='公司代码')
		    address=models.CharField(max_length=100,verbose_name='公司地址')
		    class Meta:
		        db_table='kuaidi'
		        verbose_name='快递公司'
		        verbose_name_plural=verbose_name
		    def __str__(self):
		        return self.name
		class Goods(models.Model):
		    name=models.CharField(max_length=40,verbose_name='商品名')
		    danhao=models.CharField(max_length=11,unique=True,verbose_name='快递单号')
		    price=models.DecimalField(decimal_places=2,max_digits=9,verbose_name='商品价格')
		    kuaidi_id=models.ForeignKey(Kuaidi,on_delete=models.CASCADE,related_name='kuaidi',verbose_name='外键关联')
		    class Meta:
		        db_table='goods'
		        verbose_name = '商品'
		        verbose_name_plural = verbose_name
		    def __str__(self):
		        return self.name

StringRelatedField

该字段是只读的。

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

class KuaidiSerializers(serializers.ModelSerializer):
    	kuaidi = serializers.StringRelatedField(many=True)
    	class Meta:
        	model=Kuaidi
        	fields=('name','daimai','address','kuaidi')

在这里插入图片描述

PrimaryKeyRelatedField

PrimaryKeyRelatedField 可以用于使用其主键表示关系的目标ID。
参数:
queryset - 验证字段输入时用于模型实例查找的查询集。关系必须显式设置或设置查询集read_only=True。
many- 如果应用于多对多关系,则应将此参数设置为True。
allow_null- 如果设置为True,则该字段将接受None可为空的关系的值或空字符串。默认为False。
pk_field - 设置为字段以控制主键值的序列化/反序列化。例如,pk_field=UUIDField(format=‘hex’)将UUID主键序列化为其紧凑的十六进制表示。

class KuaidiSerializers(serializers.ModelSerializer):
    	kuaidi = serializers.PrimaryKeyRelatedField(many=True,read_only=True)
    	class Meta:
        	model=Kuaidi
        	fields=('name','daimai','address','kuaidi')

在这里插入图片描述

HyperlinkedRelatedField## 标题

可以用于使用超链接表示关系的目标,默认情况下,此字段是读写的,但可以使用该read_only标志更改此行为。
参数:
view_name - 应该用作关系目标的视图名称。如果您正在使用标准路由器类,则这将是具有该格式的字符串-detail。要求。
queryset - 验证字段输入时用于模型实例查找的查询集。关系必须显式设置或设置查询集read_only=True。
many- 如果应用于多对多关系,则应将此参数设置为True。
allow_null- 如果设置为True,则该字段将接受None可为空的关系的值或空字符串。默认为False。
lookup_field - 目标上应该用于查找的字段。应该对应于引用视图上的URL关键字参数。默认是’pk’。
lookup_url_kwarg - URL conf中定义的关键字参数的名称,该参数对应于查找字段。默认使用相同的值lookup_field。
format- 如果使用格式后缀,超链接字段将为目标使用相同的格式后缀,除非使用format参数覆盖。

		class KuaidiSerializers(serializers.ModelSerializer):
	    	kuaidi=serializers.HyperlinkedIdentityField(view_name='demo:goods-detail',read_only=True,many=True)
	    	class Meta:
	        	model=Kuaidi
	        	fields=('name','daimai','address','kuaidi')

在这里插入图片描述

SlugRelatedField

用于使用目标上的字段来表示关系的目标,用作读写字段时,通常需要确保slug字段对应于带有的模型字段unique=True。
参数:
slug_field - 目标上应该用于表示它的字段。这应该是唯一标识任何给定实例的字段。例如,username。 需要
queryset - 验证字段输入时用于模型实例查找的查询集。关系必须显式设置或设置查询集read_only=True。
many- 如果应用于多对多关系,则应将此参数设置为True。
allow_null- 如果设置为True,则该字段将接受None可为空的关系的值或空字符串。默认为False。

class KuaidiSerializers(serializers.ModelSerializer):
	   	kuaidi=serializers.SlugRelatedField(many=True,read_only=True,slug_field='name')
	    	class Meta:
	        	model=Kuaidi
	        	fields=('name','daimai','address','kuaidi')

在这里插入图片描述

HyperlinkedIdentityField

可以作为标识关系应用,例如’url’HyperlinkedModelSerializer上的字段。它也可以用于对象的属性。HyperlinkedRelatedField是可以读写的,而HyperlinkedIdentityField始终为只读。

参数:
view_name - 应该用作关系目标的视图名称。如果您正在使用标准路由器类,则这将是具有该格式的字符串<model_name>-detail。 要求。
lookup_field - 目标上应该用于查找的字段。应该对应于引用视图上的URL关键字参数。默认是’pk’。
lookup_url_kwarg - URL conf中定义的关键字参数的名称,该参数对应于查找字段。默认使用相同的值lookup_field。
format- 如果使用格式后缀,超链接字段将为目标使用相同的格式后缀,除非使用format参数覆盖

class KuaidiSerializers(serializers.ModelSerializer):
	   	kuaidi=serializers.HyperlinkedIdentityField(view_name='demo:goods-detail',many=True,read_only=True)
	    	class Meta:
	        	model=Kuaidi
	        	fields=('name','daimai','address','kuaidi')

在这里插入图片描述

嵌套关系

嵌套关系可以使用序列化程序作为字段来表示。

如果该字段用于表示多对多关系,则应将该many=True标志添加到序列化程序字段。
默认情况下,嵌套序列化程序是只读的

class KuaidiSerializers(serializers.ModelSerializer):
	   	kuaidi=GoodsSerializers(many=True,read_only=True)
	    	class Meta:
	        	model=Kuaidi
	        	fields=('name','daimai','address','kuaidi')

在这里插入图片描述

可写嵌套序列化程序

如果要支持对嵌套序列化程序字段的写操作,则需要创建create()和/或update()方法,以便明确指定应如何保存子关系。

class KuaidiSerializers(serializers.ModelSerializer):
	 kuaidi=GoodsSerializers(many=True)
	    class Meta:
	        model=Kuaidi
	        fields=('name','daimai','address','kuaidi')
	    def create(self, validated_data):
	        tracks_data = validated_data.pop('kuaidi_id')
	        good = Goods.objects.create(**validated_data)
	        for track_data in tracks_data:
	            Goods.objects.create(good=good, **track_data)
	        return good

在这里插入图片描述

自定义关系字段

可以实现一个完全自定义的关系字段,该字段准确描述应如何从模型实例生成输出表示。

要实现自定义关系字段,应该覆盖RelatedField并实现该.to_representation(self, value)方法。此方法将字段的目标作为value参数,并应返回应用于序列化目标的表示。该value参数通常是模型实例。
如果要实现读写关系字段,还必须实现该.to_internal_value(self, data)方法。
要提供基于的动态查询集context,您还可以覆盖.get_queryset(self)而不是.queryset在类上指定或初始化字段时。

class GoodsSerializers(serializers.ModelSerializer):
	 class Meta:
	        model=Goods
	        fields='__all__'

class GoodsRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        return '快递商品为:%s' % value.name

class KuaidiSerializers(serializers.ModelSerializer):
	kuaidi=GoodsRelatedField(read_only=True,many=True)
	class Meta:
	    model=Kuaidi
	    fields=('name','daimai','address','kuaidi')

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章