2010-09-20 72 views
34

我一直在开发Django中的一些RESTful服务,以便与Flash和Android应用程序一起使用。在Django中序列化外键对象

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

我有这样一个模型:

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和个人)只是它们相关对象的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默认不会这样做,但有没有办法自动序列化一个对象及其所有相关的对象?任何提示或阅读将不胜感激。

+1

[PEP-008](http://www.python.org/dev/peps/pep-0008) – 2013-11-13 05:50:44

回答

24

我有类似的要求,虽然不是用于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

STUFF的弹塞串行序列化模型时与Django的串行器100%兼容。 反序列化数据流时,Deserializer类当前仅适用于由标准Django串行器返回的序列化数据。

(强调)

希望这有助于。

10

UPDATE: 其实马诺的解决方案是一个有点过时,东西的串行器的Wad有一段时间没有更新,当我尝试时,似乎它不再支持Django 1.6了。但是,请看Django's official doc here。它提供了一些使用内置自然键的方法。似乎django的内置序列化程序在支持使用ImageField作为自然键的一部分时遇到了一些问题。但是,这可以很容易地由你自己修复。

+0

谢谢!我忘了自然钥匙;) – 2016-02-14 02:06:04

+0

@沉浩晨,你的链接似乎不再可及。但我同意你的看法,上述解决方案已经过时。你能否刷新链接? – 2016-04-30 21:51:15