【发布时间】:2021-09-07 08:31:33
【问题描述】:
我今年 4 月下旬才开始使用 Django,这是我第一次处理大量 JSONB 数据。希望有人可以就此异常的原因提供一些意见:
格式错误:TypeError: JSON 对象必须是 str、bytes 或 bytearray,而不是 dict
所以我检查了我的数据(我使用的是 PostgreSQL,它来自数据库视图,列名“decision”是 JSONB 数据类型),JSON 数据实际上看起来像这样完美:
{
"some_id": "long-uuid-string",
"case": {
"name": "CaseA",
"description": "DescriptionA",
"case_date": "2021-06-23"
},
"justice": {
"name": "JusticeA",
"decision": [
{
"name": "DecisionA",
"decision_date": "2021-06-23",
"decision_flag": true,
"decision_comment": null
}
]
}
}
但我注意到了"decision_flag": true 和"decision_comment": null,但我认为 Django+Python 应该能够转换但看起来不能。
我的理解是 Django 序列化程序应该能够自动识别这些值 - null、true 和 false - 我不必手动替换它们,或者我的模型中有什么东西我失踪了?我试图通过print(instance.values('justice')[0]['justice']) 打印值,以便我可以检查但抛出相同的异常。但我的其他 JSON 数据 case 很好,我可以用 print(instance.values('case')[0]['case']) 打印它,我的假设是因为它没有 null、true 和 false 值。
这是我的模型:
class Justice(models.Model):
some_id = models.UUIDField(unique=True)
case = models.JSONField()
justice = models.JSONField()
submission = models.JSONField()
evaluation = models.JSONField()
litigation = models.JSONField()
denial = models.JSONField()
triel = models.JSONField()
def __str__(self):
return str(self.some_id)
这是我的观点:
class JusticeView(APIView):
serializer_class = JusticeSerializer
def get_object(self, request, **kwargs):
some_id = self.kwargs['some_id']
try:
obj = get_object_or_404(Justice, pk=some_id)
except Justice.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
return obj
def get(self, request, **kwargs):
data = self.get_object()
serializer = JusticeSerializer(data)
return Response(serializer.data)
这是我的序列化器:
class JusticeSerializer(serializers.ModelSerializer):
case = serializers.JSONField()
justice = serializers.JSONField()
class Meta:
model = Justice
fields = '__all__'
希望在这里得到一些帮助。干杯。
【问题讨论】:
-
我更新了上面的代码,以反映我对 get_object_or_404() 的实现——我发现它更简洁,只有模型和 pk。
标签: django-serializer django-jsonfield