如何序列化包含非模型字段的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
相关产品推荐
相关产品推荐

