python - 在 Django 中序列化外键对象

标签 python django django-orm

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

相关文章:

python - 使用 Django 管理时未保存 ManyToMany 字段

python - 以编程方式同步 Django 中的数据库

python - 如何在seaborn中绘制带有一天x标签的时间序列?

python - 那么有 4 个引号的故事是什么?

Python:翻译/替换不是你想要的字符串单词

mysql - 奇怪的不区分大小写的选择行为 Django + mysql

django - Django 上 IntegerFields 的默认范围是多少?

python - Django:创建版本号增加的模型对象

python - Django 通过一个表获取数据并过滤一组相关对象

python - 使用另一个数据框中的值作为查找表更改一个数据框中的值