<p>另一个解决方案可能是使用django信号。你知道吗</p>
<p>Django将在保存任何模型之前发送一个<code>pre_save</code>信号,这样您就可以钩住一个函数对它做出反应并执行检查。你知道吗</p>
<p>类似于(构建@Eliot Berriot解决方案):</p>
<pre><code>from django.db.models.signals import pre_save
from django.core.exceptions import ValidationError
def validate_num_books(sender, **kwargs):
if isinstance(sender, Student):
max_books = 3
elif isinstance(sender, Employee):
max_books = 30
books_count = sender.books.all().count()
if books_count >= max_books:
raise ValidationError("This person has too much books !")
pre_save.connect(validate_num_books, sender=Employee, dispatch_uid='validate_num_books')
pre_save.connect(validate_num_books, sender=Student, dispatch_uid='validate_num_books')
</code></pre>
<p>注意事项:</p>
<ol>
<li><p>我不确定ValidationError是否会产生预期效果。希望它足以绕过正在保存的模型,但可能它不是这样工作的,或者在某些情况下是这样的,或者在其他情况下不是这样的。。。将此代码段视为实验性伪代码。</p></li>
<li><p>正如你可能已经从上面的一点猜到的,我不太习惯信号,仍然有点厌倦这些。这可能是完全好的,但如果一个更清洁的解决方案出现,我可能会去它,并完全避免信号。越简单越好。</p></li>
<li><p>与Eliot的答案相比,这个解决方案的唯一优点是它避免了继承,正如他所说的那样,继承会导致性能问题。但是,如果您避免在父类上定义字段,我认为应该可以。</p></li>
</ol>
<p>如果你决定用信号做实验,<a href="https://docs.djangoproject.com/en/dev/topics/signals/" rel="nofollow">start here</a>。你知道吗</p>