小编ast*_*cci的帖子

Django休息框架和模型验证

开始使用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最终运行模型的验证器.仍然迷失为什么那些似乎没有运行,所以.

python django validation django-rest-framework

19
推荐指数
1
解决办法
6104
查看次数

发布python包 - 你应该包含doc和测试吗?

所以,我在pypi上发布了一个小型库,更多的是作为练习("看看它是如何完成的")而不是其他任何东西.

我已经在readthedocs上载了文档,我在我的git repo中有一个测试套件.

由于我认为任何可能对运行测试感兴趣的人可能只是克隆了repo,并且文档已经在线提供,我决定不在发布的包中包含doc和test目录,我只是想知道这是不是"正确"的事情要做.

我知道这个问题的答案是相当主观的,但我觉得这是一个好的地方,以便了解社区认为最佳做法.

python packaging

8
推荐指数
1
解决办法
239
查看次数