【问题标题】:Django Models - Add property in JSONDjango 模型 - 在 JSON 中添加属性
【发布时间】:2013-10-27 01:18:07
【问题描述】:

如何在使用django.core.serializers 制作的 JSON 中添加模型的属性以在 AJAX 调用中返回?

我有一个模型:

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

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

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

但这不起作用。如何传递此属性的值?

【问题讨论】:

    标签: django json serialization django-models


    【解决方案1】:

    如果没有subclassing your own serializer 作为default serializer only goes through the db fields,似乎没有简单的方法来实现这一点。

    【讨论】:

    • 谢谢!您链接到的答案效果很好!我根据this gist 做了一些更改后使用了它。我在答案中发布了我的序列化程序
    • 仅供参考:这是 2007 年不会修复的相关 Django 错误:code.djangoproject.com/ticket/3661 我想知道是时候重新审视它了..
    【解决方案2】:

    这个 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)
    

    (基于this answer,由Tim Edgar ^ 发布并使用this gist 更改)

    用法:

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

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 2018-06-27
      • 2015-08-28
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多