Многопользовательские запросы в Django - PullRequest
4 голосов
/ 16 сентября 2008

Какой лучший и / или самый быстрый способ выполнения многопользовательских запросов в Django с использованием API ORM и QuerySet?

Ответы [ 4 ]

4 голосов
/ 16 сентября 2008

Если вы пытаетесь объединить таблицы, связанные отношениями 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")
2 голосов
/ 16 сентября 2008

Не используйте API ;-) Серьезно, если ваш JOIN сложен, вы должны увидеть значительное увеличение производительности, переключившись на SQL, а не используя API. И это не значит, что вам нужно запачкать грязный SQL во всем вашем прекрасном коде Python; просто создайте собственный менеджер для обработки JOIN, а затем используйте остальной код, а не прямой SQL.

Кроме того, я был как раз на DjangoCon, где у них был семинар по высокопроизводительному Django, и одна из ключевых вещей, которые я от него убрал, заключалась в том, что если производительность - это реальная проблема (и вы когда-нибудь планируете иметь значительный трафик) вы действительно не должны делать JOINs, потому что они делают масштабирование вашего приложения практически невозможным.

Вот видео, которое Google сделал из разговора: http://www.youtube.com/watch?v=D-4UN4MkSyI&feature=PlayList&p=D415FAF806EC47A1&index=20

Конечно, если вы знаете, что вашему приложению никогда не придется сталкиваться с такой проблемой масштабирования, ПРИСОЕДИНЯЙТЕСЬ :-) И если вы также не беспокоитесь о снижении производительности при использовании API, то вы на самом деле не нужно беспокоиться о (AFAIK) незначительной разнице в производительности между использованием одного метода API и другим.

Просто используйте: http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

Надеюсь, что это поможет (а если и не поможет, то надеется, что какой-нибудь настоящий хакер Django сможет подсказать и объяснить, почему метод X действительно имеет заметную разницу в производительности).

1 голос
/ 16 декабря 2008

Используйте метод queryset.query.join, но только если другой метод, описанный здесь (с использованием двойного подчеркивания), не подходит.

0 голосов
/ 12 декабря 2009

В блоге Caktus есть ответ на этот вопрос: http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

По сути, существует скрытый метод QuerySet.query.join, который позволяет добавлять пользовательские объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...