tipos libro español def campos __init__ python django

python - español - libro django 2017



Escribiendo una función__init__ para ser usada en el modelo django (4)

Estoy intentando 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="[email protected]")

Pero si está configurado 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", "[email protected]")


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'', ''[email protected]'',''0123456789'',''5432106789'',....)

Otro problema aquí es que no sabes 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=''[email protected]'', 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/