判决是什么?在我的模型或模型表格中验证?

时间:2015-03-09 10:48:03

标签: python django django-models django-forms

我意识到这个问题有点被问到herehere以及elsewhere

......但回应似乎有点不确定。我想也许以下具体的例子可能会引起一些具体原因,说明为什么这是一个好的策略。

那么,这样做有什么不对?排除的字段和默认值似乎工作得很好。某些ORM方法不会调用save(),但是你也不会使用ModelForms。还有别的东西我不见了吗?是只是向后兼容吗?

from django.db import models
from django.core.exceptions import ValidationError

class Person(models.Model):
    favorite_food = models.CharField(max_length=250)

    def clean(self, *args, **kwargs):
        if self.favorite_food == 'bacon':
            raise ValidationError('Bacon is not good for you!')
        super(Person, self).clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(Person, self).save(*args, **kwargs)

为了DRY的利益,至少在模型中首先进行验证似乎是一个很好的经验法则,#fat;"胖模型&#34 ;? ...并且只将验证逻辑移到ModelForms,其中验证上下文可能依赖于模型之外的字段,例如request.user的权限? (即便如此,如果它很重要,也许它们应该在模型中呢?)

我非常喜欢在那里,在一个地方,而不是在这里,在ModelFrom中再次使用和管理员表单验证 bacon ...希望听到一些反对这样做的坚实论据!< / p>

1 个答案:

答案 0 :(得分:0)

这可能会因为过于宽泛而被关闭,但我会尽力给出最好的答案,那就是......也许。

Django模型只是模型,因此将其作为数据建模练习,而不是形式与模型的关系。重要的是要注意Django does provide documentation that actually encourages overriding the `clean* method,就像你的情况一样。

但是,从广义上讲,回答你的问题,下面是一些可能有助于回答你的问题:

  • 在模型中对此逻辑进行建模是否有意义? - 如果您确定Person永远不应该将培根作为最喜欢的,那么这里的建模不是&#39;问题。它是域的一部分,在此强制执行是&#34;逻辑&#34;。
  • 逻辑会偶尔改变吗? - 模型(在我看来)应该保持相对静态,它们是您的业务领域的抽象 - 希望不会经常改变。如果您发现您的逻辑会经常更改,将其放入表单是一个更好的选择。幸运的是,您可以在主站点和管理站点之间重用表单。
  • 逻辑是否会频繁更改 - 这些列表是否会令人无法接受&#39;物品变化很多?在运行时?非开发人员管理员?现在我们又回到了建模阶段。也许需要有一个模型来管理&#34;不可接受的食物&#34;,对此模型进行检查。

最终,这是否是一个好的策略&#34;是非常主观的,取决于您的实际代码,而不仅仅是假的Food模型 * 。覆盖clean方法的能力存在是有原因的,只要你能证明这个位置是合理的,那么你就可以去了。

* Not that I have anything against contrived fake examples using food.