Escribir una función __init__ para ser usada en el modelo django

Estoy tratando de escribir una función __init__ para uno de mis modelos para poder crear un objeto haciendo

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

Cuando escribo el modelo, tengo

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

Esto funciona y puedo guardar el objeto en la base de datos, pero cuando hago ‘User.objects.all ()’, no aparece nada a menos que saque mi función __init__ . ¿Algunas ideas?

Confiar en la funcionalidad incorporada de Django y pasar parámetros con nombre sería la forma más sencilla de hacerlo.

 p = User(name="Fred", email="fred@example.com") 

Pero si está listo para guardar algunas pulsaciones de teclas, sugeriría agregar un método de conveniencia estática a la clase en lugar de jugar con el inicializador.

 # In User class declaration @classmethod def create(cls, name, email): return cls(name=name, email=email) # Use it p = User.create("Fred", "fred@example.com") 

Django espera que la firma del constructor de un modelo sea (self, *args, **kwargs) , o algún facsímil razonable. Tu cambio de firma a algo completamente incompatible lo ha roto.

La respuesta correcta es evitar anular __init__ y escribir un método de clase como se describe en los documentos de Django .

Pero esto se puede hacer como si estuvieras intentando, solo necesitas agregar *args, **kwargs para que tu __init__ , y pasarlos a la llamada del súper método.

 def __init__(self, name, email, house_id, password, *args, **kwargs): super(models.Model, self).__init__(self, *args, **kwargs) self.name = name self.email = email 

No cree modelos con parámetros args. Si haces un modelo como este:

  User('name','email') 

Se vuelve muy ilegible muy rápidamente ya que la mayoría de los modelos requieren más que eso para la inicialización. Usted podría fácilmente terminar con:

 User('Bert', 'Reynolds', 'me@bertreynolds.com','0123456789','5432106789',....) 

Otro problema aquí es que usted no sabe si ‘Bert’ es el nombre o el apellido. Los dos últimos números podrían ser fácilmente un número de teléfono y una identificación del sistema. Pero sin que sea explícito, los mezclará más fácilmente, o mezclará el orden si está utilizando identificadores. Lo que es más, es que hacerlo por orden supondrá otra restricción para otros desarrolladores que usan este método y no recordarán el orden arbitrario de los parámetros.

Prefieres algo como esto en su lugar:

 User( first_name='Bert', last_name='Reynolds', email='me@bertreynolds.com', phone='0123456789', system_id='5432106789', ) 

Si esto es para pruebas o algo así, puedes usar una fábrica para crear modelos rápidamente. El enlace de Factory Boy puede ser útil: http://factoryboy.readthedocs.org/en/latest/