我一直致力于在 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/