Django EmbeddedModelField说;此字段不能为空";执行PUT请求时,尽管字段中有;空白=真;

Django EmbeddedModelField说;此字段不能为空";执行PUT请求时,尽管字段中有;空白=真;,django,mongodb,django-models,django-rest-framework,djongo,Django,Mongodb,Django Models,Django Rest Framework,Djongo,我正在使用Django rest框架创建一个Django应用程序,并使用Django连接到MongoDB。我有这样的嵌套模型: class Group(models.Model): users = models.ArrayModelField( model_container=User ) class User(models.Model): number = models.IntegerField( default=None,

我正在使用Django rest框架创建一个Django应用程序,并使用Django连接到MongoDB。我有这样的嵌套模型:

class Group(models.Model):
    users = models.ArrayModelField(
        model_container=User
    )

class User(models.Model):
    number = models.IntegerField(
        default=None,
        null=True
    )

    song = models.EmbeddedModelField(
        model_container=Song,
        null=True,
        blank=True
    )

    class Meta:
        abstract = True

class Song(models.Model):
    mp3_file = models.URLField(
        default=None,
        blank=True,
        null=True
    )

    comments = models.CharField(
        max_length=250,
        default='',
        blank=True
    )

    class Meta:
        abstract = True
创建组时,用户和歌曲的创建没有任何问题。例如,创建组时,组可能看起来像:

{
    "name": "Sample",
    "users: [
        {
            "number": null,
            "song": {
                "mp3_file": null,
                "comments": ""
            }
        }
    ]
}
这一切都很好。但是,如果我尝试执行PUT请求并且不更改“number”、“mp3_file”或“comments”的值,我将收到以下错误消息:

"user": [
    {
        "number": [
            "This field may not be null."
        ],
        "song": {
            "mp3_file": [
                "This field may not be null."
            ],
            "comments": [
                "This field may not be blank."
            ]
        }
    }
]
关于如何修正这个错误有什么想法吗?我只是使用一个通用的RetrieveUpdatedStroyapiView作为该端点的视图

编辑:我还尝试过重新创建所有迁移以及删除表并重新创建它,但这两种方法都没有帮助

编辑: 以下是视图:

class GroupDetail(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = GroupSerializer
    queryset = Group.objects.all()
    lookup_field = 'group_name'
    lookup_url_kwarg = 'group_name'
以及序列化程序:

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    users = UserSerializer(many=True)

    def update(self, instance, validated_data):
        if validated_data.get('group_name', None) is not None:
            instance.__setattr__('group_name', validated_data.get('group_name'))

        instance.save()

        return instance

    class Meta:
        model = Group
        fields = (
            'group_name',
            'users'
        )


class UserSerializer(serializers.Serializer):
    number = serializers.IntegerField()
    song = SongSerializer()


class SongSerializer(serializers.Serializer):
    mp3_file = serializers.URLField()
    comments = serializers.CharField(
        max_length=250
    )
但问题的一部分是,由于数据验证不正确,因此从未访问序列化程序。

尝试更改:

class UserSerializer(serializers.Serializer):
    number = serializers.IntegerField(allow_null=True)
    song = SongSerializer()

class SongSerializer(serializers.Serializer):
    mp3_file = serializers.URLField(allow_blank=True)
    comments = serializers.CharField(
        max_length=250, allow_blank=True
    )

尝试使用
rest\u和
,并替换
序列化程序。序列化程序
DjongoModelSerializer

你能发布
检索更新的stroyapiew
序列化程序
吗?@NgocPham我编辑了这篇文章。但问题的一部分是,由于数据验证不正确(我相信),序列化程序从未被访问过。在
SongSerializer
中可能是错误的。尝试在
comments=serializers.CharField(max\u length=250)
@NgocPham中添加
blank=True
,当我这样做时,我会得到以下错误:“TypeError:\uu init\uuuuu()得到一个意外的关键字参数'blank'”嗯,尝试在序列化程序中使用allow\u blank=True