Django中的Multijoin查询

时间:2008-09-16 14:00:54

标签: django orm join

使用ORM和QuerySet API在Django中进行多连接查询的最佳和/或最快方法是什么?

4 个答案:

答案 0 :(得分:4)

如果您尝试连接通过ForeignKeys或ManyToManyField关系链接的表,则可以使用双下划线语法。例如,如果您有以下型号:

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) 

您可以执行以下操作:

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

答案 1 :(得分:2)

不要使用API​​ ;-)严重的是,如果您的JOIN很复杂,您应该通过下载到SQL而不是使用API​​来看到显着的性能提升。这并不意味着你需要在你漂亮的Python代码中得到脏的SQL;只需创建一个自定义管理器来处理JOIN,然后让其余代码使用它而不是直接使用SQL。

另外,我刚刚参加DjangoCon,他们在那里举办了一场关于高性能Django的研讨会,其中一个关键的事情是,如果性能是一个真正的问题(并且你计划有一天会有大量的流量) ,你真的不应该首先做JOIN,因为他们在保持体面的性能几乎不可能的同时扩展你的应用程序。

以下是谷歌发布的视频: http://www.youtube.com/watch?v=D-4UN4MkSyI&feature=PlayList&p=D415FAF806EC47A1&index=20

当然,如果您知道您的应用程序永远不必处理这种扩展问题,请加入:-)如果您还不担心使用API​​的性能损失,那么您真的不需要担心(AFAIK)使用一种API方法与另一种API方法之间的性能差异(如果有的话)。

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

希望有所帮助(如果没有,希望一些真正的Django黑客可以跳进去解释为什么方法X实际上确实有一些明显的性能差异。)

答案 2 :(得分:1)

使用queryset.query.join方法,但前提是此处描述的其他方法(使用双下划线)不够。

答案 3 :(得分:0)

Caktus博客对此有一个答案:http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

基本上有一个隐藏的QuerySet.query.join方法,允许添加自定义连接。