在Djang中序列化外键对象

2024-04-27 23:47:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在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在默认情况下不会这样做,但是有没有办法自动序列化一个对象及其所有相关对象?任何提示或阅读将不胜感激。


Tags: 对象djangotrue序列化object关系modelstype
3条回答

您可以在这张票上找到更多信息:

通过指定深度跟随关系允许深度序列化 https://code.djangoproject.com/ticket/4656

我有一个类似的要求,虽然不是为了休息。在我的例子中,^{}通过使用“完整”序列化模块,我能够实现我所需要的。这是wadofstuff的一部分,在新的BSD许可证下分发。

wadofsuff让这变得很容易。例如,在您的情况下,您需要执行以下操作:

首先,安装wadofsuff。

其次,将以下设置添加到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.

(强调)

希望这有帮助。

更新: 实际上,Manoj的解决方案有点过时了,一段时间以来,Stuff的序列化程序都没有更新,当我尝试这样做时,它似乎不再支持Django 1.6了。

不过,看看Django's official doc here。它确实提供了一些使用内置自然键的方法。django的内置序列化程序似乎在支持使用ImageField作为自然键的一部分方面有点问题。但这很容易被你自己解决。

相关问题 更多 >