我之前已经意识到这一点,但是我无法找到真正解决我想要做的事情的问题。我认为这很简单,但我想知道一般人群认为最好的形式在这里。
假设我们有以下内容:
class TestClass(models.Model):
user = models.ForeignKey(User)
testfield = models.CharField()
testbool = models.BooleanField(default=False)
def save(self, *args, **kwargs):
"""
- what we're trying to do here is ensure that the User doesn't have more than
X (lets say 5) related test fields.
- what if we also wanted to add validation to testfield to ensure it was
only [a-zA-Z]?
"""
if TestClass.objects.filter(user=self.user).count() >= 5:
# How do we exit gracefully?
return
super(TestClass, self).save(*args, **kwargs)
保存功能中的注释几乎总结了我的问题: - 我们如何确保给予用户的相关TestClass不超过5个 - 如果已经有5个,我们如何从保存(不保存)中优雅地退出 - 我们如何向用户报告此事? - 我们在哪里验证testfield对象以确保它只有[a-z]?我可以直接导入re并在此处执行此操作吗? 应该我?
最好把这一切都放在这里吗?我应该发射pre_save信号吗?或者我应该使用ModelForm w / validation?
答案 0 :(得分:0)
你是对的,目前没有明显的地方可以做到这一点。这就是为什么现在有一个Summer of Code项目正在进行添加模型级验证,这应该会使这种事情变得简单易行。
不幸的是,几个月后它还没有准备好。与此同时,您的答案取决于数据的添加方式。它会以编程方式完成,还是始终通过表单完成?如果是后者,那么将验证放入表单就行了(请注意,您可以在管理员和自己的视图中使用相同的模型或其子类,因此不需要复制逻辑)。