Bootstrap

芦苇打代码--Django外键的序列化与反序列化入库

Django的序列化与反序列化对实际的开发中起着关键的作用,特别是前后端分离时可以更好的存储和读取数据,可以自动的序列化成可以让网页读取的数据:比如Json格式等…
一般的序列化比如dumps转json,但是前后端分离中我们一般使用序列化器,常见的序列化器有
serializers.Serializer和serializers.ModelSerializer
本博客要说的serializers.ModelSerializer的使用,在与Django的表关联时推荐使用这种方法

以下举例几种常用的方法:

serializers.ModelSerializer序列化查询

直接上代码,简单易懂:

isinstance用来序列化时使用
data用来反序列化是使用
两个一起用时 说明数据要更新了

user = models.Users.objects.all().first()
user_data = UserSerializer(
isinstance = user #isinstance 序列化时使用
#data = user 反序列化时使用
#两个一起使用 表示数据要更新了)
return Response(user_data.data)

查询表数据和表外键的所有信息:

这里使用的时序列化器嵌套
当序列化器嵌套查询表时会将第一张表的数据先序列化出来放入与他关联的表的字段
查询出来的数据会将关联的表所有字段数据显示出来

class SocialUserSerializer(serializers.ModelSerializer):
	users = UserSerializer()
	class Meta:
		fields = "__all__"
		model = models.SociaUser

查询表数据和表外键的单个字段信息:

这种操作可以看到外键表的指定字段信息
但是需要在外键model类下面定义__str__属性
def str(self):
return self.name (需要显示的字段名)

class SocialUserSerializer(serializers.ModelSerializer):
	users = serializer.StringRelatedField()
	class Meta:
		fields = "__all__"
		model = models.SociaUser

外键序列化入库:

第一种:

定义序列化器,用于反序列化入库

#定义序列化器  进行反序列化
class SocialUserSerializer(serializers.ModelSerializer):
	def create(self,validate):
		print(validate)
		users = models.SocialUser.objects.create(**validate)
		return users
	class Meta:
		fields = "__all__"
		model = models.SocialUser

“user”:ones.id user是关联表的字段 ones.id是被关联的一整条数据的id
就是将被关联表的id存入到关联表的user字段,这种方法只能存id,否则会报错

data_socialuser = {
'user':ones.id,
'platfrom_ID':1,
'platfrom_type':2,
'uid':access_token['uid']}
queryDict_socialuser = QueryDict('', mutable=True)
queryDict_socialuser.update(data_socialuser)
try:
	socialuser = SocialUserSerializer(data = data_socialuser)
	if socialuser.is_valid():
	print(socialuser)
	socialuser.save()
	print('成功存入第二张表')
	mes['code']=200
except Exception as e:
	print(e)
return Response(mes)

第二种:

本方法是比较推荐的方法
user字段本身设置为只读,但是后期我们想要存入数据的化需要给定额外的值才能存入
context固定值 [‘user’]是viws里面设定的外键值的Key

class SocialUserSerializer(serializers.ModelSerializer):
	user = serializers.PrimaryKeyRelateField(red_only = True) #只读不写
	def create(self,validate):
		users = models.SocialUser.objects.create(user = self.context['user'],**validate)
		return users
	class Meta:
		fields = "__all__"
		model = models.SocialUser

这里存值不再是被关联表数据的id了,而是一整条数据
因为序列化器user字段本身设置为只读,所以要定义context字段,设置key value
key是随意定义的,value是被关联表的一整条数据

data_socialuser = {
'platfrom_ID':1,
'platfrom_type':2,
'uid':access_token['uid']}
queryDict_socialuser = QueryDict('', mutable=True)
queryDict_socialuser.update(data_socialuser)
try:
	socialuser = SocialUserSerializer(data = data_socialuser,context={'user':user})
	if socialuser.is_valid():
		print(socialuser)
		socialuser.save()
		print('成功存入第二张表')
		mes['code']=200
except Exception as e:
	print(e)
return Response(mes)

总结:
个人观点:
serializers.ModelSerializer对表关系可以进行自动校验,自动关联表内结构,但是可扩展性不高
serializers.Serializer不对表关系自动关联,需要手动添加序列化字段,可扩展性高
serializers.ModelSerializer是非常适合与表关联时使用,serializers.Serializer适合没有进行表关联时使用,当然两种都可以进行序列化与反序列化,不存在serializers.ModelSerializer是序列化serializers.Serializer是反序列化,只是针对不同的情况下使用,所以理解比较慢的好友们不要被误导了。

;