Is save() called implicitly when calling create in django?

innospark picture innospark · Mar 31, 2013 · Viewed 18.5k times · Source

I'm trying to perform some custom validation on a model and I'm getting confused. Let me be specific. Let's say my code is as follows:

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)

Now, when I am working with this model from the shell, if I call:

f = Foo.objects.create_foo("")

It will raise a validation error before I get a chance to call save() on f. Why does this happen? Shouldn't the validation error only be raised once I call f.save()?

Note: the same thing happens if I use objects.create() as opposed to the custom defined create method. Any help would be greatly appreciated, as I'm finding validations in django to be fairly frustrating.

Answer

Burhan Khalid picture Burhan Khalid · Mar 31, 2013

create() will automatically save, so even if you fix your error - you will still have to make sure the arguments to create fulfill the database requirements to save a record.