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/