2008-09-16 21 views

Répondre

4

Si vous essayez de vous joindre à travers des tables liées par des relations ForeignKeys ou ManyToManyField, vous pouvez utiliser la syntaxe de double trait de soulignement. Par exemple, si vous avez les modèles suivants:

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) 

Vous pouvez faire quelque chose comme:

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

ne fonctionne pas: FieldError: impossible de résoudre le mot-clé 'bar_set' en champ. Les choix sont: bar, bleh, id – naw

+1

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

+0

Cela peut avoir changé dans les 1,5 années depuis que je l'ai posté à l'origine. Merci pour le correctif/mise à jour naw! – afarnham

2

Ne pas utiliser l'API ;-) Sérieusement, si votre REJOIGNEZ sont complexes, vous devriez voir important les performances augmentent en passant à SQL plutôt qu'en utilisant l'API. Et cela ne signifie pas que vous avez besoin de vous salir le sale SQL partout dans votre beau code Python; Créez simplement un gestionnaire personnalisé pour gérer les JOINs et demandez au reste de votre code de l'utiliser plutôt que de diriger SQL. De plus, j'étais juste à DjangoCon où ils ont eu un séminaire sur Django haute performance, et l'une des choses clés que j'ai retenues est que si la performance est une réelle préoccupation (et que vous prévoyez d'avoir un trafic important un jour), vous ne devriez pas faire JOINs en premier lieu, car ils rendent la mise à l'échelle de votre application tout en maintenant des performances décentes pratiquement impossible.

Voici une vidéo de Google fait de la conversation: http://www.youtube.com/watch?v=D-4UN4MkSyI&feature=PlayList&p=D415FAF806EC47A1&index=20

Bien sûr, si vous savez que votre demande ne va devoir faire face à ce genre de mise à l'échelle préoccupation, REJOIGNEZ loin :-) Et si vous Ne vous inquiétez pas non plus de l'impact sur les performances de l'utilisation de l'API, vous n'avez pas à vous inquiéter de la différence de performance (AFAIK) minuscule, le cas échéant, entre l'utilisation d'une méthode API plutôt qu'une autre.

utiliser Just: http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

espoir qui aide (et si elle ne le fait pas, je l'espère un peu vrai pirate Django peut sauter et expliquer pourquoi la méthode X réellement a une différence notable des performances).

+0

"si vos JOIN sont complexes, vous devriez voir des augmentations significatives des performances en passant à SQL" - cela n'a aucun sens en tant qu'expression générale. Il est peut-être vrai que l'ORM crée un SQL médiocre dans certains cas, mais pour la plupart des JOIN, il écrit le même SQL que vous écririez. –

1

Utilisez la méthode queryset.query.join, mais uniquement si l'autre méthode décrite ici (à l'aide de doubles caractères de soulignement) n'est pas appropriée.