python - 如何使 ModelSerializer DRF 中的 ListField 不强制

标签 python django django-rest-framework

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

我让它正常工作,问题是在通过 Django REST Framework 更新对象时,我没有成功使该字段成为非强制字段。

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

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

只有当我在可浏览 API 上执行 PUT 操作时,我才会收到错误消息,检查查询是否将主题标签发送为空。

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


------WebKitFormBoundary4L5MFBPrRA0QDqFL

错误如下:

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

最佳答案

您正在发送主题标签的帖子数据,但没有内容,这就是 DRF 返回该错误消息的原因。您可以使用以下方法修复该问题:

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

但请注意,您可能需要调整一些代码来处理 hashtags 规范化为空字符串的情况。

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

相关文章:

python - 有什么办法可以过滤掉python中的单词吗?

django - 如何使用 F() 对象在 Django ORM 中执行此操作?

rest - 如何检查 django-rest-framework 3.0 序列化程序中的 OPTIONS 请求?

django - 在详细路由上使用权限类

python - 如何在脚本(pycharm)中使用 ffmpeg 将 webm/mp4 文件转换为 mp3?

python - 格式化 Pandas Dataframe 以绘制图形

python - Django 1.11 - 使用时区 2018-01-01T00 :00:00+03:00 into datetime object to be used for queryset 转换日期时间字符串

python - 子进程 block Django View

python - 序列化器测试 serializer.is_valid() = False

python - 如何强制 scipy.optimize.curve_fit 修复第一点?