2015-01-20 17 views
5

sto Tring un po 'come questo:relazione ForeignKey di classe astratta

class F(models.Model): 
    class Meta: 
     abstract = True 

class C1(F): 
class C2(F): 

class D(F): 
     pid = models.ForeignKey(Cx) 

dove Cx potrebbe essere o C1 o C2, ma non so come fare.

qualcuno potrebbe guidarmi? Grazie

Python 3.3 Django 1.7

risposta

2

quello che stai chiedendo non è possibile direttamente, non si può avere un ForeignKey ad un modello astratto, come modelli astratti non hanno tabelle del database a cui collegarsi.

È possibile eseguire una di queste due cose. O rendere F una classe concreta, ci sono alcuni aspetti negativi di questo, ma non è un cattivo modo di andare.

class F(models.Model): 
    pass 

class C1(F): 
    pass 
class C2(F): 
    pass 

class D(F): 
     pid = models.ForeignKey(F) 

Oppure utilizzare un GenericforeignKey che è un po 'più complicato, soprattutto se avete bisogno di limitare le scelte di modello.

1

Come accennato nell'altra risposta, poiché le classi astratte non hanno tabella, non è possibile identificarle.

È possibile, tuttavia, imitare questo comportamento con relazioni uno-a-uno:

class F(models.Model): 
    pass # stuff here 

class C1(models.Model): 
    f = models.OneToOneField(F) 

class C2(models.Model): 
    f = models.OneToOneField(F) 

class D(F): 
     pid = models.ForeignKeyField(F) 

Dovrete trovare manualmente se pid è C1 o C2, ma non dovrete mai uno scenario in cui una singola istanza di F è correlata a più di un'istanza di C1 o C2.