网络编程
位置:首页>> 网络编程>> Python编程>> django序列化时使用外键的真实值操作

django序列化时使用外键的真实值操作

作者:tmpbook  发布时间:2022-07-19 10:09:30 

标签:django,序列化,外键,真实值

展示:

一般情况下序列化得到的外键的内容只是id:


...
{
fields:
{
 uat_date: "2015-07-25",
 statu: "CG",
 name: "慢赢优化",
 tester: [
   1
  ],
 product_manager: 1,
 module: [
   2,
   3
  ],
 project: 1,
 plan_version: 1,
 publish_date: "2015-07-25",
 actual_version: 1,
 type: "XQ",
 developer: [
  1
 ]
},
model: "amazingTable.content",
pk: 1
}
...

序列化时得到外键的真实值:


...
{
fields:
{
 uat_date: "2015-07-25",
 statu: "CG",
 name: "慢赢优化",
 tester:
  [
   [
    "kevin"
   ]
  ],
 product_manager:
  [
   "kevin"
  ],
 module:
  [
   [
    "closewebbus",
    "我是描述"
   ],
   [
    "xckhapp",
    "我是描述"
   ]
  ],
 project: 1,
 plan_version: 1,
 publish_date: "2015-07-25",
 actual_version: 1,
 type: "XQ",
 developer: [
  [
   "kevin"
  ]
 ]
},
model: "amazingTable.content",
pk: 1
}
...

方法:

我序列化的是Content表,它含有一个外键关联的是Module表,1对多

我要先序列化Module表,然后序列化Content表的时候才可以使用到Module的真实值


class ModuleManager(models.Manager):
def get_by_natural_key(self, name, description):
 return self.get(name = name, description = description)

class Module(models.Model):
objects = ModuleManager()
name = models.CharField(max_length=100, unique=True)
description = models.CharField(max_length=100, blank=True, null=True)

# natual_key的序列化
def natural_key(self):
 return (self.name, self.description)

# natual_keys的解序列化
class Meta:
 unique_together = (('name', 'description'),)

序列化是否使用真实值:

jsons = serializers.serialize('json', queryset,use_natural_foreign_keys=False)

jsons = serializers.serialize('json', queryset,use_natural_foreign_keys=True)

附:

如果要给Content表序列化,那么要使用到外键的actual_key,要保证外键先序列化,如下依赖:


class Content(models.Model):
name = models.CharField(max_length=100)
...
module = models.ManyToManyField('Module')

def natural_key(self):
 return (self.name,) + self.module.natural_key()
# 和"def"同缩进
natural_key.dependencies = ['example_app.module']

补充知识:django原生的序列化serialize解析

在写接口的时候,大家都离不开对query结果集的序列化

嗯嗯嗯,一般我们都有DRF里面的序列化工具,但是django原生的serialize你们有

用过吗?????????????

上代码:


from django.core.serializers import serialize

class Test(APIView):
def get(self,request):
origin_data = Test.objects.all()
serialized_data = serialize('json',origin_data)
return HttpResponse(serialized_data )

当然,再有更便捷的工具的情况下,这种方法并不常用

在有特定需要的时候,使用这种django原生序列化,还是十分方便的

来源:https://blog.csdn.net/tmpbook/article/details/47066883

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com