在Django序列化程序中,JSONField可以处理具有混合类型值的字典吗?

时间:2019-03-31 20:30:27

标签: json django-models django-rest-framework django-serializer

有一个Django模型和一个对应的rest_framework序列化器,其字段类型为json。

from jsonfield.fields importJSONField

class Data(models.Model):
    title = models.TextField(null=True)
    detail = JSONField(null=True)

class DataSerializer(serializers.Serializer):
    title = serializers.CharField(required=False, allow_null=True)
    detail = serializers.JSONField(required=False, allow_null=True)

在将数据插入模型期间,将引发错误。 ERROR invalid input syntax for integer: "Sample" LINE 3: ...AY['id', 'name'], ARRAY[1, 'Sample']...

如果detail字段的数据为{'id':1, 'name': 'Sample'}。如果数据更改为{'id':'1', 'name': 'Sample'},则不会出现此错误。

当数据为{'id':1, 'name': 'Sample'}时是否有处理数据的方法? detail字段是否有更好的类型?还是应该修改该字段?

1 个答案:

答案 0 :(得分:0)

我无法复制该错误。

可以肯定的是,您正在连接到Postgres数据库并且正在使用内置的JSONfield?数据库是干净的,并且迁移都已应用?

在通过DRF可浏览的UI发布json负载以创建新模型时,以下内容对我来说很好:

媒体类型: application / json

内容:

{
    "title": "test data",
    "detail": {"id":1, "name": "Sample"}
}

settings.py

# ... 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': '', # snipped
        'USER': '', # snipped
        'PASSWORD': '', # snipped
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

urls.py

from django.contrib import admin
from drfsandpit.restapi import views

router = routers.DefaultRouter()
router.register(r'data', views.DataViewSet)

views.py

from rest_framework import viewsets

from .models import Data
from .serializers import DataSerializer

class DataViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Data.objects.all()
    serializer_class = DataSerializer

serializers.py

from rest_framework import serializers

from .models import Data


class DataSerializer(serializers.ModelSerializer):
    title = serializers.CharField(required=False, allow_null=True)
    detail = serializers.JSONField(required=False, allow_null=True)

    class Meta:
        model = Data
        fields = ('title', 'detail')

models.py

from django.db import models
from django.contrib.postgres.fields import JSONField


class Data(models.Model):
    title = models.TextField(null=True)
    detail = JSONField(null=True)