我意识到这个问题有点被问到here和here以及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>
答案 0 :(得分:0)
这可能会因为过于宽泛而被关闭,但我会尽力给出最好的答案,那就是......也许。
Django模型只是模型,因此将其作为数据建模练习,而不是形式与模型的关系。重要的是要注意Django does provide documentation that actually encourages overriding the `clean* method,就像你的情况一样。
但是,从广义上讲,回答你的问题,下面是一些可能有助于回答你的问题:
Person
永远不应该将培根作为最喜欢的,那么这里的建模不是&#39;问题。它是域的一部分,在此强制执行是&#34;逻辑&#34;。最终,这是否是一个好的策略&#34;是非常主观的,取决于您的实际代码,而不仅仅是假的Food
模型 * 。覆盖clean
方法的能力存在是有原因的,只要你能证明这个位置是合理的,那么你就可以去了。
* Not that I have anything against contrived fake examples using food.