Python 3.x 无法将空列表保存到Django ArrayField

Python 3.x 无法将空列表保存到Django ArrayField,python-3.x,django,postgresql,django-models,django-rest-framework,Python 3.x,Django,Postgresql,Django Models,Django Rest Framework,我有一个Django模型 from django.db import models from django.contrib.postgres.fields import ArrayField class Website(models.Model): id = models.BigAutoField(primary_key=True, verbose_name='ID') status = models.BooleanField(default=True) meta =

我有一个Django模型

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


class Website(models.Model):
    id = models.BigAutoField(primary_key=True, verbose_name='ID')
    status = models.BooleanField(default=True)
    meta = ArrayField(base_field=models.CharField(max_length=200, null=True), default=list)

我正在使用以下序列化程序将数据保存到数据库:

class WebsiteConfigSerializer(serializers.ModelSerializer):
    class Meta:
        model = Website
        fields = ('status', 'meta')
当我试图保存以下数据时,出现错误:

{
    "status": true,
    "meta": []
}

#ERROR:
# "meta : This list may not be empty."
是否无法将空列表保存到
阵列字段
? 当我根本不传递字段时,存储的值是
{NULL}
。 同样在初始迁移期间,由于我添加了一个
默认值
作为
列表
,所以所有现有条目的“meta”值都是
{}


如果根本不允许使用空列表值,那么在初始迁移期间如何保存该值?

尝试将模型更改为

来自django.db导入模型的

从django.contrib.postgres.fields导入数组字段
班级网站(models.Model):
id=models.BigAutoField(主键=True,详细名称=id)
status=models.BooleanField(默认值=True)
meta=ArrayField(基本字段=models.CharField(最大长度=200,空值=True),默认值=list,空值=True)

可以保存空列表,甚至可以默认为:

如果给字段一个默认值,请确保它是一个可调用的字段,例如list(对于空的默认值)或返回列表的可调用字段(例如函数)。错误地使用default=[]会创建在ArrayField的所有实例之间共享的可变默认值

但是,序列化程序不允许空值:

class WebsiteConfigSerializer(serializers.ModelSerializer):
    meta = serializers.ListField(
        allow_empty=True,
        child=serializers.CharField(
            max_length=200, allow_blank=True
        )
    )
    class Meta:
        model = Website
        fields = ('status', 'meta')
您可以通过创建序列化程序字段来简化此过程:

from rest_framework import serializers


class ArrayField(serializers.ListField):
    child = serializers.CharField(max_length=200, allow_blank=True)

class WebsiteConfigSerializer(serializers.ModelSerializer):
    meta = ArrayField(allow_empty=True)
    class Meta:
        model = Website
        fields = ('status', 'meta')

投票被否决,因为a)没有在一个正常的模型定义中修复序列化程序问题,b)你正在做文档中告诉你不要做的事情(在我的回答中引用)。关于可调用列表,你是正确的,但你必须更改模型,即
blank=True
。我编辑了我的答案以避免误导人们。我认为您没有抓住
ModelSerializer
类的要点。blank=True有效,并且与ModelSerializer相关。在不同实例中添加空列表也不会导致任何与可变性相关的问题。对吗?如果模型定义正确,就不需要定义序列化程序。如果使用
ModelSerializer
,映射将自动生成。见: