You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何序列化包含非模型字段的Django RawQuerySet?

解决Django Raw Query含自定义字段的JSON序列化问题

我之前也碰到过一模一样的问题!当用带自定义字段的Raw Query(比如你写的SELECT *, 'hello' AS world FROM myApp_myModel)查询结果时,Django默认的序列化方式确实会踩各种坑,下面给你几个亲测有效的解决方案:

方法一:结合Django序列化器+手动补充自定义字段

这个方法既能保留Django序列化模型字段的便捷性,又能手动加入自定义查询字段:

import json
from django.core.serializers import serialize

# 执行你的raw query
query = "SELECT *, 'hello' AS world FROM myApp_myModel"
raw_data = myModel.objects.raw(query)

result_list = []
for item in raw_data:
    # 先序列化模型自带的字段为字典
    model_fields = json.loads(serialize('json', [item]))[0]['fields']
    # 补充自定义字段
    model_fields['world'] = item.world
    # 按需添加主键(如果需要的话)
    model_fields['id'] = item.id
    result_list.append(model_fields)

# 最终转为JSON字符串
json_result = json.dumps(result_list)

方法二:手动过滤对象属性,排除不可序列化的内部状态

Raw Query返回的对象包含Django内部的_state属性(导致序列化报错),我们可以过滤掉这个属性,同时手动确保自定义字段被加入:

import json

query = "SELECT *, 'hello' AS world FROM myApp_myModel"
raw_data = myModel.objects.raw(query)

result_list = []
for obj in raw_data:
    # 过滤掉Django内部的_state属性,提取其他字段
    obj_dict = {key: value for key, value in obj.__dict__.items() if key != '_state'}
    # 确保自定义字段被加入(如果__dict__里没自动包含的话)
    obj_dict['world'] = obj.world
    result_list.append(obj_dict)

json_result = json.dumps(result_list)

为什么你之前的方法失效?

  • 直接用myModel.objects.raw(query)返回的对象包含_model_state内部属性,这个是Django用来追踪模型状态的,无法被JSON序列化;
  • serializers.serialize('json', data)只会序列化模型类中定义的字段,完全忽略Raw Query中自定义的world字段;
  • 直接取r.__dict__虽然能拿到模型字段,但因为包含_state会导致序列化报错,而且部分情况下自定义字段可能不会自动被加入到__dict__中。

内容的提问来源于stack exchange,提问作者Bart Juriewicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:38:40