开始使用django-rest-framework,我在验证方面遇到了一些麻烦.
我有一个基本的模型,并且我已经将验证器应用于其字段的copple(常规MaxLengthValidator和自定义RegexValidator,最终得到如下内容:
class ZipCodeValidator(RegexValidator):
regex = '^([0-9]{5})$'
message = u'Invalid ZipCode.'
class User(AbstractUser, BaseUser):
"""
Custom user model
"""
# ... other fields ...
zipcode = models.CharField(
max_length=5, blank=True, validators=[ZipCodeValidator()]
)
description = models.TextField(
null=True, blank=True, max_length=1000, validators=[MaxLengthValidator(1000)]
)
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个ModelSerializer映射到这个模型,带有一些额外的字段和方法.这一切都由一个非常简单的`RetrieveUpdateAPIView提供.
我注意到没有调用验证器(我可以在zipcode字段中输入任何内容,或者在描述中输入超过1000个字符).
快速而肮脏的解决方案是覆盖序列化程序级别的两个字段,并在那里为它们分配验证器:
class UserSerializer(serializers.ModelSerializer):
zipcode = serializers.WritableField(
source='zipcode', required=False, validators=[ZipCodeValidator()]
)
description = serializers.WritableField(
source='description', required=False, validators=[MaxLengthValidator(1000)]
)
Run Code Online (Sandbox Code Playgroud)
这很好,但我不喜欢它.我宁愿在模型级别进行此验证更安全(我不会在序列化程序上进行头脑自定义或额外验证,但在所有情况下都需要强制执行这些规则).由于序列化程序的工作方式与django表单很相似,我希望它们clean在保存之前调用模型的&cie方法,但快速查看源代码似乎表明它没有.
这有点烦人,它强迫我复制大部分字段代码,如果我想确保验证总是发生,我宁愿保持尽可能干.
我可能会遗漏一些东西,但在更新模型之前,是否有一种很好的方法可以确保序列化程序运行这些验证器?
编辑: Doubled检查了源,事实证明实例的full_clean方法确实被视图调用,然后将其保存到db,而db最终运行模型的验证器.仍然迷失为什么那些似乎没有运行,所以.
所以,我在pypi上发布了一个小型库,更多的是作为练习("看看它是如何完成的")而不是其他任何东西.
我已经在readthedocs上载了文档,我在我的git repo中有一个测试套件.
由于我认为任何可能对运行测试感兴趣的人可能只是克隆了repo,并且文档已经在线提供,我决定不在发布的包中包含doc和test目录,我只是想知道这是不是"正确"的事情要做.
我知道这个问题的答案是相当主观的,但我觉得这是一个好的地方,以便了解社区认为最佳做法.