Django Serializer 的问题涉及嵌套 JSON 和 null,以及布尔值 true 或 false
Problem with Django Serializer involving nested JSON with null, and boolean values true or false
我今年 4 月下旬才开始使用 Django,这是我第一次处理一堆 JSONB 数据。希望有人可以就此异常的原因提供一些意见:
Error in formatting: TypeError: the JSON object must be str, bytes or bytearray, not 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)
这是我的 Serializer:
class JusticeSerializer(serializers.ModelSerializer):
case = serializers.JSONField()
justice = serializers.JSONField()
class Meta:
model = Justice
fields = '__all__'
希望在这里得到一些帮助。干杯。
我就是这样解决这个问题的。我不确定这是否是最好的方法,但至少这是有效的——如果有更好的方法——Django 方式——我肯定会考虑。
我修改了模型,将所有 JSONField 更改为 TextField。请注意,此模型仅适用于我的数据库视图 - 这不是实际的 table,但我的“view_definition”中的所有来源都具有 JSONB 作为数据类型。
class Justice(models.Model):
some_id = models.UUIDField(unique=True)
case = models.TextField(null=True)
justice = models.TextField(null=True)
submission = models.TextField(null=True)
evaluation = models.TextField(null=True)
litigation = models.TextField(null=True)
denial = models.TextField(null=True)
triel = models.TextField(null=True)
def __str__(self):
return str(self.some_id)
对于 JSONB 类型的每一列,我使用 serializers.JSONField()
保持序列化程序不变。我的数据库视图保持不变,其中 JSON 列采用 JSONB 格式。
我今年 4 月下旬才开始使用 Django,这是我第一次处理一堆 JSONB 数据。希望有人可以就此异常的原因提供一些意见:
Error in formatting: TypeError: the JSON object must be str, bytes or bytearray, not 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)
这是我的 Serializer:
class JusticeSerializer(serializers.ModelSerializer):
case = serializers.JSONField()
justice = serializers.JSONField()
class Meta:
model = Justice
fields = '__all__'
希望在这里得到一些帮助。干杯。
我就是这样解决这个问题的。我不确定这是否是最好的方法,但至少这是有效的——如果有更好的方法——Django 方式——我肯定会考虑。
我修改了模型,将所有 JSONField 更改为 TextField。请注意,此模型仅适用于我的数据库视图 - 这不是实际的 table,但我的“view_definition”中的所有来源都具有 JSONB 作为数据类型。
class Justice(models.Model):
some_id = models.UUIDField(unique=True)
case = models.TextField(null=True)
justice = models.TextField(null=True)
submission = models.TextField(null=True)
evaluation = models.TextField(null=True)
litigation = models.TextField(null=True)
denial = models.TextField(null=True)
triel = models.TextField(null=True)
def __str__(self):
return str(self.some_id)
对于 JSONB 类型的每一列,我使用 serializers.JSONField()
保持序列化程序不变。我的数据库视图保持不变,其中 JSON 列采用 JSONB 格式。