django - 在 Django REST 框架中进行 SlugField 验证的推荐方法是什么?

标签 django django-rest-framework

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

深入研究代码,我可以看到字段的长度run_validators 中的 django.core.validators.MaxLengthValidator 验证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

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

最佳答案

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

最佳行动方案:

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

干杯,

汤姆

关于django - 在 Django REST 框架中进行 SlugField 验证的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636471/

相关文章:

python - 如何将 Django 查询设置为列明智地呈现到 html 表中?

django - 使用带有 S3boto 后端的 django-storages 保存到 S3 时,如何设置 "Content-Type"?

json - 在python中将pymongo查询集序列化为json

django - 又不存在于/admin/login/---- 吗?

python - Base64 编码 HTTP_AUTHORIZATION header DRF

python - Django REST框架不解析UTF-8

带有 RegistrationSupplementBase 的 Django 导入错误的 Python 无法导入名称 'ugettext_lazy'

django - 如何修改get_queryset结果值

django Rest Framework - 如何向 api 文档(drf_yasg)添加 post 参数?

django - Django RestFramework Elasticsearch :时间轴API