2010-06-01 11 views
6

Mis modelos están configurados de la siguiente manera (esto es un ejemplo y no mis modelos reales)herencia Django con el campo ForeignKey

class modelA(Model): 
    field1 = CharField(max_length=50) 

class modelB(modelA): 
    field2 = CharField(max_length=50) 

class anotherModel(Model): 
    connection = models.ForeignKey(modelA) 
    title = CharField(max_length=50) 

iba a ser capaz de tener una conexión a ModelB almacenada en anotherModel desde ModelB hereda de modelo A.

mod_b = modelB() 
conn_b = anotherModel() 
conn_b.connection = mod_b 

Si no, ¿cómo manejaría esto?

Gracias

Respuesta

4

El Generic Relations feature a partir de Django incorporada TiposContenido módulo es la forma más compatible para manejar las claves externas polimórficos.

Deberá agregar algunos campos de soporte a su modelo para que el marco pueda determinar qué clase particular representa una clave externa, pero aparte de eso, se encargará de cargar el tipo correcto de manera bastante transparente.

En su caso, sería algo así como:

from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

# modelA and modelB as before 

class anotherModel(Model): 
    connection_content_type = models.ForeignKey(ContentType) 
    connection_object_id = models.PositiveIntegerField() 
    connection = generic.GenericForeignKey('connection_content_type', 
     'connection_object_id') 

Tenga en cuenta que no es necesario configurar/leer los connection_content_type o connection_object_id campos ti mismo ... el marco genéricos se encargará de que para usted, solo necesitan estar ahí para que los genéricos funcionen.

mod_a = modelA() 
mod_b = modelB() 

conn = anotherModel() 
conn.connection = mod_b 
conn.save() 
conn.connection = mod_a # change your mind 
conn.save() 
0

Sí, puedes hacer eso. Si agrega una ForeignKey en "anotherModel" al modelo B y prueba a ejecutar syncdb, le ladrará y le indicará que necesita especificar un "related_name". Por lo tanto, en uno (o ambos) de sus campos ForeignKey agregue un atributo related_name.

También debe leer esto: http://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name para obtener más información sobre related_name.

+0

syncdb solo capta errores en el nivel de definición del modelo - John sin embargo quiere saber si puede aplicar sus definiciones de una determinada manera – Geradeausanwalt

Cuestiones relacionadas