2013-03-19 14 views
17

Ich habe Schwierigkeiten, die richtige Abfrage für mein Projekt zu bekommen. Hier ist ein Beispiel oder mein Modell:Django Filter Query Foreign Key

from django.db import models 

class Publisher(models.Model): 
    name = models.CharField(max_length=30) 
    address = models.CharField(max_length=50) 
    city = models.CharField(max_length=60) 
    state_province = models.CharField(max_length=30) 
    country = models.CharField(max_length=50) 
    website = models.URLField() 

    def __unicode__(self): 
     return self.name 

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField() 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication_date = models.DateField() 

    def __unicode__(self): 
     return self.title 

wie kann ich Verleger aus der Buch-Klasse zum Beispiel bekomme ich alle Verleger für alle Bücher zu bekommen, die den Titel beginnend mit ‚Hallo‘ hat? Vielen Dank

Antwort

28

Wenn Sie Publisher erhalten möchten, müssen Sie mit Publisher beginnen. Das bedeutet, dass Sie über die Buch → Publisher-Beziehung rückwärts abfragen müssen. Hier ist, was die docs sagen über sie:

Lookups that span relationships

Um eine Beziehung zu erstrecken, benutzen Sie einfach die Feldnamen von verwandten Feldern in Modellen von doppelten Unterstrichen getrennt, bis Sie auf das Feld erhalten mögen Sie

...

Um auf eine "umgekehrte" Beziehung zu verweisen, verwenden Sie einfach den Kleinbuchstaben des Modells.

Die Abfrage:

Publisher.objects.filter(book__title__startswith='hello') 
+1

es funktionierte ^^ Vielen Dank Sie meine Frist gespeichert ^^ –

+0

Was ist, wenn ich alle Bücher von einigen Verlag veröffentlicht sehen wollen? –

+1

@ArindamRoychowdhury: 'Book.objects.filter (publisher__name = 'Some')' –