2010-06-01 26 views
6

I miei modelli sono impostati come segue (questo è un esempio e non i miei modelli reali)django eredità con 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) 

dovrei essere in grado di disporre di una connessione a modelB memorizzato in anotherModel dal modelB eredita da modello A.

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

In caso contrario, come gestirlo?

Grazie

risposta

4

Il Generic Relations feature dal di Django built-in ContentTypes modulo è il modo più sostenuto per gestire le chiavi esterne polimorfici.

Sarà necessario aggiungere alcuni campi di supporto al modello in modo che il framework possa capire quale particolare classe rappresenta una chiave esterna, ma a parte il fatto che gestirà il caricamento del tipo corretto in modo abbastanza trasparente.

Nel tuo caso, sarebbe qualcosa di simile:

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') 

Si noti che non è necessario impostare/leggere le connection_content_type o connection_object_id campi da soli ... il quadro generici gestirà che per voi, hanno solo bisogno di essere lì per far funzionare i generici.

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ì, lo puoi fare. Se aggiungi un ForeignKey in "anotherModel" a modelB e provi ad eseguire syncdb, ti abbaia dicendo che devi specificare un "related_name". Quindi, su uno (o entrambi) dei tuoi campi ForeignKey aggiungi un attributo related_name.

Si consiglia inoltre di leggere questo: http://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name per ottenere ulteriori informazioni su related_name.

+0

syncdb rileva solo errori a livello di definizione del modello - John tuttavia desidera sapere se è possibile applicare le sue definizioni in un determinato modo – Geradeausanwalt

Problemi correlati