3

我正在使用 Django REST 框架构建一个 RESTful API。我的一个模型看起来有点像这样:

class Zone(models.Model):
    name = models.SlugField(max_length=50, unique=True)
    ... other fields

所以我建立了一个这样的序列化器:

class ZoneSerializer(serializers.ModelSerializer):

    class Meta:
        model = Zone
        fields = ('name', ... other fields)

在发布数据以创建新区域时,我不确定自己负责多少验证以及应该自动进行多少验证。我尝试了以下测试用例:

  1. name是 50 个字符或更少的有效 slug 时,验证成功。
  2. name是 50 多个字符的有效 slug 时,验证失败并显示相应的错误消息。
  3. 什么时候name是一个无效的 slug(例如“abc def”),验证成功并使用无效名称创建一个区域。

深入研究代码,我可以看到字段的长度django.core.validators.MaxLengthValidatorin run_validatorsin验证rest_framework/fields.py,但validate_slug不包含在验证器列表中。

我知道我可以validate_name像这样向我的序列化程序添加一个方法:

def validate_name(self, attrs, source):
    """
    Make sure this is a slug field
    """
    value = attrs[source]
    if not validators.validate_slug(value):
        raise serializers.ValidationError("Not a slug")
    return attrs

但这似乎有点矫枉过正。我在这里做错了吗?

4

1 回答 1

2

听起来那里有一个有效的拉取请求。:)validate_slug可能应该自动发生。

最佳行动方案:

  1. 仔细检查 Django slug 表单字段行为与 REST 框架序列化程序字段行为 - 它们肯定不同吗?
  2. 提出问题的票,注意您从 (1) 中确定的内容。
  3. 尝试编写一个失败的测试用例并将其作为拉取请求提交。
  4. 如果可能,请使用修复程序更新 PR。
  5. 利润!!!11!!!!(好吧,把你的名字写进演职员表中,并因为贡献了修复而获得了一种温暖的感觉)

干杯,

汤姆

于 2013-05-20T09:01:21.770 回答