代码之家  ›  专栏  ›  技术社区  ›  Greg

django中的多连接查询

  •  4
  • Greg  · 技术社区  · 17 年前

    使用orm和queryset api在django中执行多连接查询的最佳和/或最快方法是什么?

    4 回复  |  直到 11 年前
        1
  •  4
  •   zengr    11 年前

    如果您试图加入由外键或MyTyMyFielfield关系链接的表,那么可以使用双下划线语法。例如,如果您有以下型号:

    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")
    
        2
  •  2
  •   machineghost    17 年前

    不要使用api;-)说真的,如果你的连接很复杂,你应该会看到通过使用sql而不是api来显著提高性能。这并不意味着您需要在漂亮的python代码中使用脏sql;只需创建一个自定义管理器来处理连接,然后让其余代码使用它,而不是直接使用sql。

    另外,我在DjangCon,他们在一个高性能Django研讨会,其中一个关键的东西,我拿走它是,如果性能是一个真正的关注(和你计划有重大交通有一天),你真的不应该做连接在首位,因为它们使得在保持良好性能的同时扩展你的应用几乎是不可能的。

    以下是谷歌制作的视频: 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确实有一些明显的性能差异)。

        3
  •  1
  •   bnjmnhggns    17 年前

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

        4
  •  0
  •   Viesturs    16 年前

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

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

    推荐文章