Pregunta

Recientemente he comenzado a experimentar con Django para algunas aplicaciones web en mi tiempo libre. Si bien el diseño del modelo de datos para uno, me encontré con el dilema de utilizar la herencia para definir un usuario de la página web o el uso de una técnica conocida como parches mono con la clase de usuario ya suministrada por el marco.

He intentado añadir un campo a través de (después de tener definidos todos mis modelos, etc., sin errores, de acuerdo con python manage.py validate):

User.add_to_class('location', models.CharField(max_length=250,blank=True))

y ejecutado el comando syncdb. Sin embargo, me siguen dando este error

  

OperationalError: hay tal columna:   auth_user.location

si estoy en la vista administrador del sitio o de la cáscara manage.py. Tiene que haber un paso adicional que me falta, pero parece que hay poca documentación sobre toda la técnica mono parches. Así que te estoy pidiendo ayuda antes de recurro a la herencia. Cualquier código, consejos, o punteros a documentación adicional, por supuesto, bienvenida.

Gracias de antemano.

PS. Soy consciente de esta técnica es feo, y probablemente poco recomendado. ;)

¿Fue útil?

Solución

Cuando se agrega un campo a cualquier modelo, incluso si lo haces de la manera 'oficial', es necesario migrar la base de datos - Django no lo haga por usted. Eliminar la tabla y correr ./manage.py syncdb de nuevo.

Es posible que desee para investigar uno de los marcos de las migraciones, como south, que gestionará este tipo de cosas para usted.

Otros consejos

Hay una alternativa a ambos enfoques, que es simplemente usar un modelo de perfil relacionada . Esto también pasa a ser un enfoque bien documentado, muy recomendable. Tal vez la razón por la que el enfoque add_to_class no está bien documentada, como usted señaló, se debe a que de explícitamente desalentado (por buenas razones).

usos marco Djangos metaclases para inicializar las tablas. Esto significa que puede no mono-parche en nuevas columnas, a menos que también vuelve a inicializar la clase, que no estoy seguro es incluso posible. (Puede ser).

Ver entre volver clase modificado y utilizando el tipo de () por algo más de información.

supongo que podría encontrarse con problemas con respecto a dónde se define su monkeypatch. Supongo que Django syncdb crea Databse tablas sólo de la aplicación de autenticación "pura", por lo que su modelo será entonces sin "localización", y luego su sitio con el parche a mirar para el campo.

se describe Probablemente manera menos dolorosa de añadir información adicional a los perfiles de usuario en docs Django .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top