建议使用非模型字段序列化Django RawQuerySet [英] Recommended way of serializing Django RawQuerySet with non-model fields

查看:21
本文介绍了建议使用非模型字段序列化Django RawQuerySet的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有了像SELECT *, 'hello' AS world FROM myApp_myModel这样的查询,我想把它序列化为json。

看起来没什么大不了的,上面有很多类似的问题,但似乎没有一个给出直接的答案。

到目前为止我已尝试:

data = myModel.objects.raw(query)

# gives: ModelState is not serializable
json.dumps([dict(r.__dict__) for r in data])

# doesn't serialize 'world' column, only model fields:
serializers.serialize('json', data)

#dear God:
for r in data:
    for k in dict(r.__dict__):
        print(getattr(r,k))

推荐答案

问题:

内置django core serializers尚未准备好包含额外字段(来自RAW,也不来自批注表达式),它仅从_meta.local_fields获取模型字段。

您可以在Djangodjango/core/serializers/base.py源代码:

看到
concrete_model = obj._meta.concrete_model #obj is an object model
...
for field in concrete_model._meta.local_fields:
    if field.serialize or field is pk_parent:
       if field.remote_field is None:
            if (self.selected_fields is None 
                or field.attname in self.selected_fields):
               self.handle_field(obj, field)
        else:
            if (self.selected_fields is None 
                or field.attname[:-3] in self.selected_fields):
                self.handle_fk_field(obj, field)

救援时的姜戈睡觉框架:

要解决您的问题,您可以使用非内置功能。您可以在项目中包含睡觉包。例如django rest framework可以处理额外的字段:

from django.db.models import F
from aula.apps.alumnes.models import MyModel
from rest_framework.renderers import JSONRenderer

data=MyModel.objects.annotate(dummy = F('some_field') )

class MyModelSerializer(serializers.ModelSerializer):
    dummy = serializers.CharField()
    class Meta:
        model = MyModel
        fields = ('some_other_field','dummy')
        read_only_fields = (
            'dummy',
        )

m=MyModelSerializer(data, many=True)
JSONRenderer().render(m.data)

这篇关于建议使用非模型字段序列化Django RawQuerySet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆