2008-09-16 5 views

Antwort

4

Wenn Sie versuchen, Tabellen zu verknüpfen, die durch ForeignKeys- oder ManyToManyField-Beziehungen verknüpft sind, können Sie die doppelte Unterstrichsyntax verwenden. Wenn Sie zum Beispiel die folgenden Modelle:

class Foo(models.Model): 
    name = models.CharField(max_length=255) 

class FizzBuzz(models.Model): 
    bleh = models.CharField(max_length=255) 

class Bar(models.Model): 
    foo = models.ForeignKey(Foo) 
    fizzbuzz = models.ForeignKey(FizzBuzz) 

können Sie so etwas wie:

Fizzbuzz.objects.filter(bar__foo__name = "Adrian") 
+0

das funktioniert nicht: FieldError: Kann Schlüsselwort 'bar_set' in Feld nicht auflösen. Zur Auswahl stehen: bar, bleh, id – naw

+1

Verwendung: Fizzbuzz.objects.filter (bar__foo__name = "Adrian") – naw

+0

Dies könnte sich in den 1.5 Jahren geändert haben, seit ich es ursprünglich gepostet habe. Danke für die Reparatur/Update naw! – afarnham

2

Sie die API nicht verwenden ;-) Im Ernst, wenn Ihre komplexen JOIN sind, sollten Sie bedeutende sehen Die Leistung erhöht sich, indem Sie in SQL und nicht über die API herunterfahren. Und das bedeutet nicht, dass Sie schmutzig schmutzige SQL überall auf Ihrem schönen Python-Code bekommen müssen; Erstellen Sie einfach einen benutzerdefinierten Manager, um die JOINs zu verarbeiten, und verwenden Sie dann den Rest Ihres Codes lieber als direktes SQL.

Außerdem war ich gerade auf der DjangoCon, wo sie ein Seminar über Hochleistungs-Django hatten, und eines der wichtigsten Dinge, die ich daraus machte, war, dass Leistung ein echtes Problem ist (und Sie planen, irgendwann erheblichen Verkehr zu haben), sollten Sie JOINs nicht wirklich machen, da sie die Skalierung Ihrer App bei gleichbleibender Leistung praktisch unmöglich machen.

Hier ist ein Video Google des Vortrages gemacht:

Natürlich http://www.youtube.com/watch?v=D-4UN4MkSyI&feature=PlayList&p=D415FAF806EC47A1&index=20, wenn Sie, dass Ihre Anwendung kann nie wissen, mit dieser Art von Skalierung Sorge, JOIN weg :-) Und wenn Sie zu tun haben wird Sorgen Sie sich auch nicht um die Leistungseinbußen bei der Verwendung der API, dann müssen Sie sich wirklich keine Gedanken über den (AFAIK) winzigen Leistungsunterschied zwischen der Verwendung einer API-Methode gegenüber einer anderen machen.

Verwenden Sie einfach: http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

Hoffnung, das hilft (und wenn es nicht der Fall ist, hoffentlich einige wahre Hacker Django kann springen und erklären, warum Methode X tatsächlich eine spürbare Performance-Unterschied hat).

+0

"Wenn Ihr JOIN komplex ist, sollten Sie erhebliche Leistungssteigerungen feststellen, wenn Sie in SQL herunterfahren" - dies ist als allgemeine Aussage nicht sinnvoll. Es mag wahr sein, dass das ORM in bestimmten Edge-Fällen schlechtes SQL erzeugt, aber für die meisten JOINs schreibt es dasselbe SQL, das Sie schreiben würden. –

1

Verwenden Sie die queryset.query.join-Methode, aber nur, wenn die andere hier beschriebene Methode (mit doppelten Unterstrichen) nicht ausreichend ist.