Django DRF模型序列化-序列化模型属性

ff29svar  于 2023-02-14  发布在  Go
关注(0)|答案(2)|浏览(174)

如何在使用django.core.serializers创建的JSON中添加Model的属性以在AJAX调用中返回?
我有一个模特:

class MyModel(models.Model):
...
@property
def property_field(self):
    return some_value;

然后在视图中,我在 AJAX 调用中发送了这个模型的JSON。问题是,我不知道如何发送这个属性返回的值。我试过了

query_set = MyModel.objects.flter(...)
serializers.serialize('json', query_set, fields=('...', ... , 'a_property'))

但这样不行,怎么传递这个属性的值呢?

hwazgwia

hwazgwia1#

看起来没有subclassing your own serializer就没有简单的方法来实现这一点,因为默认的序列化器只通过db字段。

k3fezbri

k3fezbri2#

    • 编辑**:

上一个答案是很久以前写的。正如预期的那样,现在有更简单的方法来完成此操作:

class MyModelSerializer(serializers.ModelSerializer):
    property_field = serializers.CharField(
        source="property_field",
        read_only=True,
    )

这将在序列化的OrderedDict中添加property_field属性,您可以将其返回给客户端

    • 用法:**
serializer = MyModelSerializer(MyModel.objects.all())
return Response(serializer.data)
    • 旧答案**

这个JSON序列化器应该工作:

from StringIO import StringIO
from django.core.serializers.json import Serializer

class JSONSerializer(Serializer):
    def serialize(self, queryset, attributes, **options):
        self.options = options
        self.stream = options.get("stream", StringIO())
        self.start_serialization()
        self.first = True

        for obj in queryset:
            self.start_object(obj)
            for field in attributes:
                self.handle_field(obj, field)
            self.end_object(obj)
            if self.first:
                self.first = False
        self.end_serialization()
        return self.getvalue()

    def handle_field(self, obj, field):
        self._current[field] = getattr(obj, field)

(基于**Tim Edgar ^**发布的this answer,并使用this gist进行了更改)
用法:

json = JSONSerializer().serialize(modelName.objects.all(), ('attr1', 'property1', ...))

相关问题