我一直在努力开发可在Django和Flash应用程序中使用的RESTful服务。
开发服务接口非常简单,但是我遇到了序列化具有外键和多对多关系的对象的问题。
我有一个像这样的模型:
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(),以确保遵循外键关系:
select_related()
artifact = Artifact.objects.select_related().get(pk=pk)
获得对象后,我将其序列化,并将其传递回我的视图:
serializers.serialize( "json", [ artifact ] )
这就是我得到的,请注意,外键(object_type和个人)只是其相关对象的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的真正满意之处在于,它将默认遵循关系并创建嵌套对象,并且能够在调用查询时解除关系的绑定。
这样就很容易以一种无需个案干预的方式来抽象服务。
我看到Django默认情况下不执行此操作,但是有没有一种方法可以自动序列化一个对象及其所有相关对象?任何提示或阅读将不胜感激。
我有类似的要求,尽管不是出于RESTful的目的。在我的情况下,我可以通过使用“完整”序列化模块来实现所需的功能Django Full Serializers。这是wadofstuff的一部分,并根据新的BSD许可证分发。
Django Full Serializers
Wadofstuff使此操作非常容易。例如,在您的情况下,您需要执行以下操作:
首先,安装wadofstuff。
其次,将以下设置添加到settings.py文件中:
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关键字参数。唯一(次要)陷阱是使用形成关系的字段名称,而不是相关模型的名称。
relations
警告
从文档中:
在序列化模型时,Wad of Stuff序列化程序与Django序列化程序100%兼容。 反序列化数据流时,Deserializer该类当前仅适用于标准Django序列化程序返回的序列化数据。
Deserializer
(添加了强调)
希望这可以帮助。