Django模型覆盖保存/使用信号/或使用模型?

时间:2009-06-05 08:51:02

标签: django django-models django-forms django-signals django-validation

我之前已经意识到这一点,但是我无法找到真正解决我想要做的事情的问题。我认为这很简单,但我想知道一般人群认为最好的形式在这里。

假设我们有以下内容:

models.py

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?

1 个答案:

答案 0 :(得分:0)

你是对的,目前没有明显的地方可以做到这一点。这就是为什么现在有一个Summer of Code项目正在进行添加模型级验证,这应该会使这种事情变得简单易行。

不幸的是,几个月后它还没有准备好。与此同时,您的答案取决于数据的添加方式。它会以编程方式完成,还是始终通过表单完成?如果是后者,那么将验证放入表单就行了(请注意,您可以在管理员和自己的视图中使用相同的模型或其子类,因此不需要复制逻辑)。