2010-03-27 14 views
10

Im folgende Modell:Django Fremdschlüssel Abfragen

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

Wenn es eine Zeile in der Datenbank für Tabellenkopf als Id=1, title=value-mart , createdby=CEO

ist Wie abfragen I Kriterien und Optionen Tabellen alle Werte zu erhalten bezogen auf Header-Tabelle ID = 1

Auch kann jemand bitte einen guten Link für Abfragen Beispiele vorschlagen.

Antwort

9

Erstens, verwenden Sie nicht id in den Namen, weil es verwirrend ist. Dieses Feld ist nicht die ID, es ist das Objekt selbst. (Wenn Sie ein Feld haben ref erstellt es automatisch ein Feld ref_id)

options.objects.filter(header=a_header) 

Sie fragen ihn wie einen beliebigen Wert, wo einige Header-Instanz ist der Wert, den Sie sind Filterung auf.

3

Ich würde vorschlagen, versuchen Sie uns eine coding style und Namenskonvention, die mehr wie Sie in der Django-Dokumentation für Models sehen. Etwas mehr wie folgt aus:

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

Und dann fragen sie nach Bedarf:

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

Die Dokumentation für many-to-one relationships verweist auch ein usage example.

20

Ironfroggy ist richtig, aber es gibt einen anderen offensichtlichen Weg, um die relevanten options und criteria Objekte zu bekommen. Django erstellt automatisch eine umgekehrte Relation für jeden Fremdschlüssel, der auf ein Modell zeigt. Dies ist normalerweise der Name des zugehörigen Modells plus _set. Also:

mycriteria.options_set.all() 
mycriteria.header_set.all() 

geben Ihnen alle options und header Objekte im Zusammenhang mit einem criteria Objekt mycriteria.

Auch ein Hinweis auf Stil: als ironfroggy wies darauf hin, sollten Sie nicht id in den Fremdschlüsselfeldern verwenden, aber auch Sie sollten Aktivierte Stil für Ihre Modellklassen verwenden, so können Sie einen Unterschied zwischen der Klasse sehen Criteria und eine bestimmte Instanz criteria.

In Bezug auf die Links ist die Django documentation ausgezeichnet und erklärt all dies.

5

Klingt, als ob Sie nach Following relationships "backward" suchen.

Sie können die Header-Objekt erhalten Sie filtern, indem möchten, und

so etwas wie für detaillierte Informationen an der documentation
obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

Schauen Sie verwenden