【问题标题】:Is save() called implicitly when calling create in django?在 django 中调用 create 时是否隐式调用 save()?
【发布时间】:2013-03-21 12:43:48
【问题描述】:

我正在尝试对模型执行一些自定义验证,但我感到很困惑。让我具体一点。假设我的代码如下:

class FooManager(models.Manager):
  def create_foo(self, name):
    return self.create(foo_name = name)

class Foo(models.Model):
  foo_name = models.CharField(max_length=30)
  objects = FooManager()

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

现在,当我在 shell 中使用这个模型时,如果我调用:

f = Foo.objects.create_foo("")

在我有机会在 f 上调用 save() 之前,它会引发验证错误。为什么会这样?不应该只在我调用 f.save() 时才引发验证错误吗?

注意:如果我使用 objects.create() 而不是自定义定义的 create 方法,也会发生同样的事情。任何帮助将不胜感激,因为我发现 django 中的验证非常令人沮丧。

【问题讨论】:

    标签: django django-models django-validation


    【解决方案1】:

    create() 将自动保存,因此即使您修复了错误 - 您仍然必须确保创建的参数满足数据库要求以保存记录。

    【讨论】:

    • 为什么create会自动保存?在文档中它说:“请注意,实例化模型绝不会触及您的数据库;为此,您需要保存()。”那么调用save()有什么意义呢,如果create()会自动保存呢?
    • 这就是重点,您不需要调用save(),因为create() 是创建实例然后自动保存的快捷方式。
    • 哦,完美。我刚刚在文档中找到了概述这一点的位置,我想我会努力阅读!非常感谢,Burhan 为我节省了很多时间!
    • 不,在最后阶段进行(在保存方法中)。创建是一种方便的方法。如果您忘记在某处使用它,您不希望清洁不发生。
    【解决方案2】:

    您忘记将self 输入您的经理

    class FooManager(models.Manager):
        def create_foo(self, name):
            return self.create(foo_name = name)
    

    【讨论】:

    • 不,抱歉,这是我这个可怜的例子的错。在我的实际代码中,我确实将 self 放入了管理器中。我应该提交我的实际代码,这会有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2013-05-11
    • 1970-01-01
    • 2023-03-07
    • 2017-10-20
    • 2015-10-24
    • 2015-07-12
    相关资源
    最近更新 更多