使用ORM和QuerySet API在Django中进行多连接查询的最佳和/或最快方法是什么?
答案 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方法,允许添加自定义连接。