django - 使用非模型字段序列化 Django RawQuerySet 的推荐方法

标签 django django-queryset json-deserialization

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

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

到目前为止我已经尝试过:

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 中获取模型字段。

你可以在 django django/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 框架:

要解决您的问题,您可以使用非内置功能。您可以在项目中包含 REST 包。例如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 - 使用非模型字段序列化 Django RawQuerySet 的推荐方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49954570/

相关文章:

python - Django 测试客户端不处理异常?

python - Django ORM - 动态添加 When to Case

django - 如何显示由 prefetch_related 生成的查询

c# - 使用 JsonConvert.DeserializeObject 反序列化 yyyyMMddTHHmmssZ DateTime 格式

django - 为什么 Django 1.10 强制在设置文件中定义模板?

django - 在 git 项目中创建子模块

Python/Django : how does the ugettext_lazy function exactly work with operator %?

sql-order-by - Django 在 .annotate() 中使用 order_by 并获取相关字段

java - 使用 Jackson 将不同数量的对象反序列化为 Java 列表

java - 如何忽略导致 jackson 反序列化错误的列表条目?