2011-09-01 14 views
6

Estoy tratando de crear una asignación ORM de Django que sea compatible con una existente data model, por lo que estoy tratando de trabajar con un conjunto existente de tabla y columna nombres.Herencia múltiple de Django: especifique el nombre personalizado de columna uno a uno

Tengo una situación de herencia multi-tabla donde una clase InformationObject se deriva de la clase Object. Me gustaría dejar que Django manejar esto de la forma habitual:

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 

En este caso Django crearía automáticamente un campo de uno-a-uno en el modelo heredado llamado object_ptr_id. Sin embargo, en el esquema que estoy obligado a usar, la referencia al Objeto simplemente se llama "id". Entonces:

¿Hay alguna manera de especificar de alguna manera el nombre de la columna que Django usa automáticamente para la herencia de tablas múltiples?

La alternativa, que voy a tener que usar otro modo, es el uso de un campo explícito uno-a-uno, pero entonces no será capaz de heredar métodos no de base de datos a partir del modelo del objeto:

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(models.Model): 
    class Meta: 
     db_table = "information_object" 
    id = models.OneToOneField(Object, primary_key=True, db_column="id") 

¿Alguna idea? ¿Tal vez podría crear una clase base común para ambos y poner allí métodos que no sean DB ...?

+0

Su última idea es bastante sólido: crear una clase base común para los dos, y lo utilizan como un mixin para proporcionar la funcionalidad adicional que usted está buscando . Sugiero probarlo como un experimento. (Puede que no funcione; la capa de base de datos de Django hace algunas cosas lindas con las metaclases de Python, pero vale la pena intentarlo). –

Respuesta

8

Desde el (versión de desarrollo) django docs:

Como se ha mencionado, Django creará automáticamente una OneToOneField la vinculación de su clase hija de vuelta cualquiera de los modelos de padres no abstractos. Si desea controlar el nombre del atributo que vincula al padre, puede crear su propio OneToOneField y establecer parent_link = True para indicar que su campo es el enlace de regreso a la clase principal.

1

Según lo mencionado por @fusion al citar de los documentos, tendrá que crear un OneToOneField si desea especificar la columna, mientras utiliza la herencia del modelo. Los campos heredados estarán disponibles en la clase secundaria tanto en el ámbito propio como en el campo de uno a uno.

class Object(models.Model): 
    class Meta: 
     db_table = "object" 
    column_1 = models.CharField() 

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 
    # arbitrary property name (parent_link) 
    parent_link = models.OneToOneField(Object, primary_key=True, db_column="id", parent_link=True) 

En este ejemplo:

>>> inf_obj = InformationObject.objects.get(pk=1) 
>>> print inf_obj.column_1 == inf_obj.parent_link.column_1 
True 
Cuestiones relacionadas