尽管字段具有“空白=真”,但 Django EmbeddedModelField 在执行 PUT 请求时说“此字段可能不是空白”

Posted

技术标签:

【中文标题】尽管字段具有“空白=真”,但 Django EmbeddedModelField 在执行 PUT 请求时说“此字段可能不是空白”【英文标题】:Django EmbeddedModelField saying "This field may not be blank" when doing PUT request despite field having "blank=True" 【发布时间】:2019-06-19 21:30:25 【问题描述】:

我正在使用 django-rest-framework 创建一个 Django 应用程序,并使用 djongo 连接到 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”或“cmets”的值,我将收到以下错误消息:

"user": [
    
        "number": [
            "This field may not be null."
        ],
        "song": 
            "mp3_file": [
                "This field may not be null."
            ],
            "comments": [
                "This field may not be blank."
            ]
        
    
]

关于如何修复此错误的任何想法?我只是使用通用的 RetrieveUpdateDestroyAPIView 作为此端点的视图。

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

编辑: 这是视图:

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
    )

但问题的一部分是,由于数据验证不正确,甚至永远无法访问序列化程序。

【问题讨论】:

可以发RetrieveUpdateDestroyAPIView Serializer 吗? @NgocPham 我编辑了这篇文章。但部分问题是,由于数据未正确验证(我相信),甚至从未到达序列化程序。 SongSerializer 中可能有误。尝试在comments = serializers.CharField( max_length=250 ) 中添加blank =True @NgocPham 当我这样做时,我收到以下错误:“TypeError: __init__() got an unexpected keyword argument 'blank'” 嗯,尝试在序列化程序中使用 allow_blank=True 【参考方案1】:

尝试rest_meets_djongo,并将serializers.Serializer 替换为DjongoModelSerializer

【讨论】:

【参考方案2】:

尝试改变:

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
    )

【讨论】:

以上是关于尽管字段具有“空白=真”,但 Django EmbeddedModelField 在执行 PUT 请求时说“此字段可能不是空白”的主要内容,如果未能解决你的问题,请参考以下文章

尽管空白 = True 和 null = True,但需要 Django ForeignKey 字段

尽管将 AWS 静态文件路径添加到 CORS_ORIGIN_WHITELIST django-cors-headers,但出现 403 错误

Django为特定外键选择具有重复字段值的行

具有 ForeignKey 字段的模型的 Django ModelForm 无法正确显示 selectBox

具有标记为 pk + fk 的字段的表上的 Django HyperlinkedModelSerializer

在Django中实现具有许多重叠字段的模型的最佳方法?