Skip to main content
 首页 » 编程设计

python之Django之序列化多态模型

2024年10月25日35tintown

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

模型.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) 

View .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 字段,没有名称。

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

请您参考如下方法:

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

在大多数地方,Django 隐藏了将两个模型绑定(bind)在一起的底层 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")