tags:

views:

1642

answers:

2

Hi,

I'm trying to write an init function for one of my models so that I can create an object by doing

p = User('name','email')

When I write the model, I have

    def __init__(self, name, email, house_id, password):
            models.Model.__init__(self)
            self.name = name
            self.email = email

This works, and I can save the object to the database, but when I do 'User.objects.all()', it doesn't pull anything up unless I take out my __init__ function. Any ideas?

+6  A: 

Django expects the signature of a model's constructor to be (self, *args, **kwargs), or some reasonable facsimile. Your changing the signature to something completely incompatible has broken it.

Ignacio Vazquez-Abrams
+7  A: 

Relying on Django's built-in functionality and passing named parameters would be the simplest way to go.

p = User(name="Fred", email="[email protected]")

But if you're set on saving some keystrokes, I'd suggest adding a static convenience method to the class instead of messing with the initializer.

# In User class declaration
def create(name, email)
  return User(name=name, email=email)
create = staticmethod(create)

# Use it
p = User.create("Fred", "[email protected]")
Baldu
Yeah, a factory method is the way to go here. You could also consider putting it on the Manager. Messing with the constructor signature will definitely break things.
Carl Meyer
Thanks man!! helped me a lot
PirosB3
@classmethod on create is also nicer
Wahnfrieden