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

问题描述 投票:1回答:1

有一个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字段是否有更好的类型或是否应修改字段?

json django-models django-rest-framework django-serializer
1个回答
0
投票

我无法复制错误。

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

当通过DRF可浏览UI发布json有效负载以创建新模型时,以下工作对我来说很合适

媒体类型:application / json

内容:

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

settings.朋友

# ... 

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

URLs.朋友

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

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

views.朋友

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

serialize认识.朋友

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.朋友

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)
© www.soinside.com 2019 - 2024. All rights reserved.