2009-12-28 6 views
8

Diciamo che ho due applicazioni Django:Django: esiste un modo per avere il modello "through" in un ManyToManyField in un'app diversa rispetto al modello che contiene ManyToManyField?

  • concorsi - che gestirà i dati sulla concorrenza
  • voci - che gestirà la funzionalità relativa ai concorrenti che entrano in competizioni

Nel app delle gare Ho un modello che rappresenta una sezione di una competizione:

class Division(models.Model): 
    competition = models.ForeignKey(Competition) 
    discipline = models.CharField(max_length=1, choices=DISCIPLINE_CHOICES) 
    age_group = models.ForeignKey(AgeGroup) 
    participants = models.ManyToManyField(Competitor, through='Entry') 

voglio mettere il modello di ingresso in app voci:

class Entry(models.Model): 
    division = models.ForeignKey('Division') 
    competitor = models.ForeignKey(Competitor) 
    withdrawn = models.BooleanField(default=False) 

Come posso risolvere il from ... import ... dichiarazioni, in modo che funzionino? Quando ho messo in dichiarazioni di importazione, come from entries.models import Entry mi vengono i modelli da queste applicazioni ignorati dalla syncdb (perché le importazioni sono circolari) o quando rimuovo una o entrambe le ricevo errori di convalida:

Error: One or more models did not validate: entries.entry: 'division' has a relation with model Division, which has either not been installed or is abstract. competitions.division: 'participants' specifies an m2m relation through model Entry, which has not been installed

capisco perché questo succede, ma non ho idea di come cambiarlo, in modo che funzioni (senza ricorrere allo spostamento del modello Entry nell'app delle competizioni, cosa che davvero non voglio fare).

+0

puoi pubblicare la classe 'Competitor'? – czarchaic

risposta

16

Sembra che ho trovato una risposta, che funziona in modo più coerente :)

Il Django documentation on the ForeignKey class dice :

To refer to models defined in another application, you can explicitly specify a model with the full application label. For example, if the Manufacturer model above is defined in another application called production, you'd need to use:

class Car(models.Model): 
    manufacturer = models.ForeignKey('production.Manufacturer') 

This sort of reference can be useful when resolving circular import dependencies between two applications.

5

a volte, django.db.models.get_model consente di aggirare le importazioni circolari. Nel tuo esempio, provare a importare Entry normalmente e chage la definizione division FK in Entry a questo:

from django.db.models import get_model 

class Entry(models.Model): 
    division = models.ForeignKey(get_model('competitions', 'Division')) 
+0

Da quello che vedo, questo non sempre funziona ... Suppongo che dipenda dall'ordine in cui django carica le app o qualcosa del genere. Ancora - un suggerimento molto utile, grazie :) –

+0

quindi "a volte";) –

+0

ooops, my bad;) –

Problemi correlati