Django序列化中获取外键真实值的方法

Finn
Finn
发布时间:2026-10-14 | 2人浏览过
原创

本文介绍如何在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序列化时获取外键真实值的操作即为全部内容,希望能提供参考,欢迎支持。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表