4

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

4

4 回答 4

4

If you are trying to join across tables linked by ForeignKeys or ManyToManyField relationships then you can use the double underscore syntax. For example if you have the following models:

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) 

You can do something like:

Fizzbuzz.objects.filter(bar__foo__name = "Adrian")
于 2008-09-16T15:05:54.540 回答
2

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

另外,我刚刚在 DjangoCon 上,他们举办了一个关于高性能 Django 的研讨会,我从中学到的一个关键问题是,如果性能是一个真正的问题(并且你计划有一天会有大量的流量),你真的首先不应该做 JOIN,因为它们使你的应用程序在保持良好性能的同时扩展几乎是不可能的。

这是 Google 制作的演讲视频: 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 实际上确实有一些明显的性能差异)。

于 2008-09-16T15:18:00.720 回答
1

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

于 2008-12-16T17:42:12.523 回答
0

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

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

于 2009-12-12T19:01:38.993 回答