【问题标题】:In django serializers can JSONField handle dictionary with mixed type values?在 django 序列化程序中,JSONField 可以处理具有混合类型值的字典吗?
【发布时间】:2019-04-02 14:48:11
【问题描述】:

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

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】:

    我无法复制错误。

    为了确定,您正在连接到 Postgres 数据库并使用内置的 JSON 字段?数据库干净,迁移都应用了吗?

    通过 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)
    

    【讨论】:

    • 改名了,还是一样的问题。
    • 当。当我明天回到键盘时,我会尝试复制这个。
    猜你喜欢
    • 2010-12-29
    • 2018-04-23
    • 2023-03-21
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多