如何在ModelSerializer DRF中创建ListField不是必需的

时间:2015-12-17 12:02:55

标签: 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)
    )

当我在Browsable API上执行PUT时,我只收到错误,检查查询是否将标签发送为空白。

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


------WebKitFormBoundary4L5MFBPrRA0QDqFL

错误如下:

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

1 个答案:

答案 0 :(得分:0)

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

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

但请注意,您可能需要调整一些代码,以便在hashtags标准化为空字符串时进行处理。