【问题标题】:What is the recommended approach for SlugField validation in Django REST framework?在 Django REST 框架中进行 SlugField 验证的推荐方法是什么?
【发布时间】:2013-05-19 15:47:46
【问题描述】:

我正在使用 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”)时,验证成功并使用无效名称创建区域。

深入代码,我可以看到字段的 lengthdjango.core.validators.MaxLengthValidator in run_validators in 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

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    最佳行动方案:

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

    干杯,

    汤姆

    【讨论】:

    • 嗨,汤姆 - 感谢您的回复,非常感谢 DRF - 太棒了!我正在比较 Django 和 REST Framework fields 代码,因为你的答案进来了——一旦我把所有的东西都整理好了,我就会按照你的建议去做。
    • 链接到随后合并的拉取请求,对于任何未来的读者:github.com/tomchristie/django-rest-framework/pull/875
    • 感谢您的更新!尽管如此, slug_validate 似乎对于 PUT 请求是有问题的,因为当我想更新进入相同 slug 的对象时,它会检索“已经存在”错误。如果它们相同,则通过 PrimaryKEY 更新对象不应引发此错误,恕我直言
    猜你喜欢
    • 2015-01-07
    • 2019-05-17
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2023-02-21
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多