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 序列化程序应该能够自动识别这些值 - nulltruefalse - 我不必手动替换它们还是我的模型中缺少某些东西?我试图通过 print(instance.values('justice')[0]['justice']) 打印值,这样我可以检查但抛出相同的异常。但是我的其他 JSON 数据 case 很好,我可以用 print(instance.values('case')[0]['case']) 打印它,我的假设是因为它没有 nulltruefalse 值。

这是我的模型:

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 格式。