我一直在Django中开发一些RESTful服务,用于Flash和Android应用程序。
开发服务接口非常简单,但是我遇到了序列化具有外键和多对多关系的对象的问题。
我有一个这样的模型:
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)
一旦我拥有了对象,我就将其序列化,并将其传递回我的视图:
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的地方是它会遵循关系,并在默认情况下创建嵌套对象,在调用查询时能够解除关系绑定。
这使得抽象服务变得非常容易,不需要逐个进行任何干预。
我看到Django在默认情况下不会这样做,但是有没有办法自动序列化一个对象及其所有相关对象?任何提示或阅读将不胜感激。
您可以在这张票上找到更多信息:
通过指定深度跟随关系允许深度序列化 https://code.djangoproject.com/ticket/4656
我有一个类似的要求,虽然不是为了休息。在我的例子中,^{} 通过使用“完整”序列化模块,我能够实现我所需要的。这是wadofstuff的一部分,在新的BSD许可证下分发。
wadofsuff让这变得很容易。例如,在您的情况下,您需要执行以下操作:
首先,安装wadofsuff。
其次,将以下设置添加到
settings.py
文件中:第三,稍微更改用于序列化的代码:
密钥更改是
relations
关键字参数。唯一(次要)的问题是使用形成关系的字段的名称,而不是相关模型的名称。警告
从documentation:
(强调)
希望这有帮助。
更新: 实际上,Manoj的解决方案有点过时了,一段时间以来,Stuff的序列化程序都没有更新,当我尝试这样做时,它似乎不再支持Django 1.6了。
不过,看看Django's official doc here。它确实提供了一些使用内置自然键的方法。django的内置序列化程序似乎在支持使用ImageField作为自然键的一部分方面有点问题。但这很容易被你自己解决。
相关问题 更多 >
编程相关推荐