我想要Django模型中的一个字段来存储字符串列表(出于某些原因,我不想使用相关字段,仅验证用户是否发送了正确的列表)。

我的工作正常,问题是通过Django REST框架更新对象时,无法强制使该字段为非必填字段。

这是我的实现,我测试了一些具有相同结果的变体

class SomeModel(models.Model):
    hashtags = models.CharField(max_length=512, default=None, null=True, blank=True)

    @property
    def hashtags_as_list(self):
        """ Hashtags are stored on DB as a text json convert to object again
        """
        return json.loads(self.hashtags) if self.hashtags else None

    @hashtags_as_list.setter
    def hashtags_as_list(self, value):
        """ Hashtags are stored on DB as a text json of the list object
        """
        self.hashtags = json.dumps(value)

class SomeModelSerializer(serializers.ModelSerializer):
    hashtags = serializers.ListField(
        source='hashtags_as_list',
        default = [],
        required = False,
        child = serializers.CharField(min_length=3, max_length=32, required=False)
    )


仅当我在Browsable API上执行PUT时,才收到错误消息,即检查查询将主题标签发送为空白。

------WebKitFormBoundary4L5MFBPrRA0QDqFL
Content-Disposition: form-data; name="hashtags"


------WebKitFormBoundary4L5MFBPrRA0QDqFL


错误如下:

{
    "hashtags": [
        "This field may not be blank."
    ]
}

最佳答案

您正在发送hashtags的发布数据,但没有内容,这就是DRF返回该错误消息的原因。您可以使用以下方法解决此问题:

hashtags = serializers.ListField(required=False, child=CharField(allow_blank=True, ...), ...)


但是请注意,当hashtags标准化为空字符串时,您可能需要调整一些代码来处理。

关于python - 如何使ModelSerializer DRF中的ListField不强制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34334141/

10-10 16:13