gpt4 book ai didi

python - 在 Django 中序列化外键对象

转载 作者:IT老高 更新时间:2023-10-28 21:40:36 28 4
gpt4 key购买 nike

我一直致力于在 Django 中开发一些 RESTful 服务,以用于 Flash 和 Android 应用程序。

开发服务接口(interface)非常简单,但我在序列化具有外键和多对多关系的对象时遇到了问题。

我有一个这样的模型:

class Artifact( models.Model ):
name = models.CharField( max_length = 255 )
year_of_origin = models.IntegerField( max_length = 4, blank = True, null = True )
object_type = models.ForeignKey( ObjectType, blank = True, null = True )
individual = models.ForeignKey( Individual, blank = True, null = True )
notes = models.TextField( blank = True, null = True )

然后我会像这样使用 select_related() 对该模型执行查询,以确保遵循外键关系:

artifact = Artifact.objects.select_related().get(pk=pk)

获得对象后,我将其序列化,并将其传递回我的 View :

serializers.serialize( "json", [ artifact ] )

这是我返回的,注意外键(object_type 和 individual)只是它们相关对象的 id。

[
{
pk: 1
model: "artifacts.artifact"
fields: {
year_of_origin: 2010
name: "Dummy Title"
notes: ""
object_type: 1
individual: 1
}
}
]

这很好,但我在使用 select_related() 时希望它会自动用相关对象填充外键字段,而不仅仅是对象的 id。

我最近转换为 Django,但投入了大量时间使用 CakePHP 进行开发。

我真正喜欢 Cake ORM 的地方在于它会遵循关系并默认创建嵌套对象,并且能够在您调用查询时取消绑定(bind)关系。

这使得以一种不需要逐案干预的方式抽象服务变得非常容易。

我看到 Django 默认不这样做,但是有没有办法自动序列化一个对象及其所有相关对象?任何提示或阅读将不胜感激。

最佳答案

我有类似的要求,但不是出于 RESTful 目的。我能够通过使用“完整”序列化模块来实现我所需要的,在我的例子中是 Django Full Serializers .这是 wadofstuff 的一部分并根据新的 BSD 许可证分发。

Wadofstuff 使这变得非常容易。例如在您的情况下,您需要执行以下操作:

首先,安装 wadofstuff。

其次,将以下设置添加到您的 settings.py 文件中:

SERIALIZATION_MODULES = {
'json': 'wadofstuff.django.serializers.json'
}

三、对用于序列化的代码稍作改动:

artifact = Artifact.objects.select_related().get(pk=pk)
serializers.serialize( "json", [ artifact ], indent = 4,
relations = ('object_type', 'individual',))

关键变化是 relations 关键字参数。唯一的(次要)问题是使用形成关系的字段名称而不是相关模型的名称。

警告

来自 documentation :

The Wad of Stuff serializers are 100% compatible with the Django serializers when serializing a model. When deserializing a data stream the the Deserializer class currently only works with serialized data returned by the standard Django serializers.

(已添加重点)

希望这会有所帮助。

关于python - 在 Django 中序列化外键对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3753359/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com