Django序列化中获取外键真实值的方法
本文介绍如何在Django中使用原生serialize函数获取外键的真实值而非仅ID。通过设置use_natural_foreign_keys=True,并定义模型的natural_key及get_by_natural_key方法,可实现关联对象的完整序列化输出,适用于需要返回详细关联数据的API场景。
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'),)
控制是否使用真实值的参数设置:
默认情况下(不获取真实值):
设置use_natural_foreign_keys为True以获取真实值:
补充说明:
若需对Content表序列化并引用外键的actual_key,必须确保外键对应的Module表已先被序列化。具体依赖关系如下:
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解析
补充知识:Django原生serialize解析
在开发接口时,对queryset结果集进行序列化是常见需求。
虽然DRF提供了便捷的序列化工具,但Django原生的serialize方法同样值得了解。
你是否使用过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原生序列化依然十分方便。
以上关于Django序列化时获取外键真实值的操作即为全部内容,希望能提供参考,欢迎支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













