2009-07-28 10 views
5

Estoy tratando de hacer una relación muchos a uno y quiero poder controlarlo (agregar-remover etc.) a través del panel de administración. Así que este es mi modelo.py:Cómo administrar la relación de muchos a uno en Django

from django.db import models 

class Office(models.Model): 
    name = models.CharField(max_length=30) 


class Province(models.Model): 
    numberPlate = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=20) 
    office = models.ForeignKey(Office) 

Quiero que mi modelo permita que una provincia tenga varias oficinas.

Así que dentro de mi admin.py:

class ProvinceCreator(admin.ModelAdmin): 
     list_filter = ['numberPlate'] 
     list_display = ['name', 'numberPlate','office'] 

class OfficeCreator(admin.ModelAdmin): 
     list_display = ['name'] 

Esto me parece correcto, sin embargo cuando intento agregar una nueva provincia con el panel de administración, me sale esto:

TemplateSyntaxError at /admin/haritaapp/province/ 

Caught an exception while rendering: no such column: haritaapp_province.office_id 

Gracias

Respuesta

6

costuras que tiene la configuración de modelos hacia atrás. Si desea que la provincia tenga muchas oficinas, entonces la provincia debe ser una clave externa en el modelo de Office.

from django.db import models 

class Province(models.Model): 
    numberPlate = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=20) 

class Office(models.Model): 
    name = models.CharField(max_length=30) 
    province = models.ForeignKey(Province) 

Esto sería manera sencilla y muy intuitiva para implementar uno-a-muchos relationsship

En cuanto al error que está recibiendo "tal columna: haritaapp_province.office_id", al agregar un nuevo atributo (en su caso) al modelo, debe agregar columna manualmente a la tabla. O eliminar la tabla y volver a ejecutar el syncdb:

python manage.py syncdb 

Django no agregar automáticamente nuevas columnas a la tabla cuando añada nuevos campos para el modelo.

+0

finalmente pude hacerlo funcionar, incluso "python manage.py syncdb" no era suficiente, así que tuve que eliminar el sqlite3 db y regenerarlo :) Una pequeña pregunta, aunque los artículos extranjeros se muestran como Province_object mientras selecciona/agrega. ¿Cómo arreglarlo para que muestre el nombre en su lugar? Saludos –

+0

oh auto edición: \t def __unicode __ (self): \t retorno self.name hizo el trabajo para mí: p –

+0

en la referencia a "Django no añadirá automáticamente nuevas columnas" - Django-sur hace un buen trabajo Sin embargo, me gustaría que el esquema de nombres de migración fuera más compatible con varios desarrolladores. – David

1

¿Has mirado los documentos para hacer Inlines?

En su admin.py

class Office(admin.TabularInline): 
    model = Office 

class ProvinceAdmin(admin.ModelAdmin): 
    inlines = [ 
     Office, 
    ] 
Cuestiones relacionadas