2009-12-28 6 views
8

Lets sagen, dass ich zwei django Anwendungen haben:Django: Gibt es eine Möglichkeit, das "Through" -Modell in einem ManyToManyField in einer anderen App als das Modell zu haben, das das ManyToManyField enthält?

  • Wettbewerbe - die Kompetitionsdaten
  • Einträge behandelt - die Funktionalität in Bezug auf die Eingabe Konkurrenten in Wettbewerben

In der Griff Wettbewerbe App Ich habe ein Modell, das einen Abschnitt eines Wettbewerbs darstellt:

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

ich das Einstiegsmodell in die Einträge App setzen wollen:

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

Wie löse ich das aus ... Import ... Anweisungen, damit sie funktionieren? Als ich in der Import-Anweisungen wie from entries.models import Entry gestellt bekomme ich die Modelle von diesem durch syncdb ignoriert Apps (weil die Importe sind kreisförmig) oder wenn ich eine von ihnen oder beide entferne ich Validierungsfehler erhalten:

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

Ich verstehe, warum das passiert, aber ich habe keine Ahnung, wie ich das ändern soll, damit es funktioniert (ohne das Entry-Modell in die App für Wettbewerbe zu verschieben, was ich wirklich nicht tun möchte).

+0

können Sie Beiträge verfassen die 'Competitor' Klasse? – czarchaic

Antwort

16

Es scheint, als ob ich eine Antwort gefunden haben, die mehr konsequent arbeitet :)

Die Django documentation on the ForeignKey class sagt :

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

manchmal hilft django.db.models.get_model um zirkuläre Importe zu arbeiten. In Ihrem Beispiel versuchen Entry normal und chage die division FK Definition in Entry dazu importieren:

from django.db.models import get_model 

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

Von dem, was ich sehen kann, funktioniert das nicht immer ... Ich denke, es hängt von der Reihenfolge ab, in der Django die Apps oder etwas ähnliches lädt. Noch - sehr nützlicher Tipp, danke :) –

+0

daher die "manchmal";) –

+0

ooops, meine schlecht;) –