Django - 序列化多态模型

时间:2014-12-02 20:18:52

标签: python django

我想序列化一个多态模型,但只有他的基类型字段是序列化的,而不是多态的。

models.py

class Folder(PolymorphicMPTTModel):
    parent = PolymorphicTreeForeignKey('self', null=True, blank=True, related_name='children')
    name = models.CharField(max_length=50)

class File(Folder):
    srs_wkt = models.CharField(max_length=1000, blank=True, null=True)

views.py

from django.core import serializers
from django.core.serializers.json import DjangoJSONEncoder

file = File.objects.get(pk=1)
serialized = serializers.serialize('python', [file,])
response = json.dumps({'file':file}, cls=DjanJSONEncode)
return HttpResponse(response, content_type="application/json")

这就是我通常如何序列化我的模型对象并将其作为JSON发送,但在这里,JSON对象只有srs_wkt字段,而不是名称。

有没有办法序列化多态模型?

1 个答案:

答案 0 :(得分:2)

原因是Folder不是抽象模型,所以你有:
https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

在大多数地方,Django隐藏了将两个模型绑定在一起的基础OneToOneField,但是序列化程序没有,请参见此处:
https://docs.djangoproject.com/en/dev/topics/serialization/#inherited-models

他们在上面的文档中提供了适合您情况的食谱,但它不是很优雅,所以我建议尝试替代方案,例如:

from django.core.serializers.json import DjangoJSONEncoder

def myview(request):
    file_dict = File.objects.filter(pk=1).values()[0]
    folder_dict = Folder.objects.filter(pk=file.folder.pk).values()[0]
    folder_dict.update(file_dict)
    response = json.dumps({'file': folder_dict}, cls=DjangoJSONEncoder)
    return HttpResponse(response, content_type="application/json")