Три стола объект QuerySet (полное внешнее соединение?) в Django


У меня есть три таблицы, мне нужен запрос, чтобы отобразить для пользователя для веб-приложения, которые я написал. Каждая таблица (URL-адрес, обратите внимание, цитата) имеет внешний ключ отношения к таблице пользователей. Для каждого пользователя, мне нужно отсортировать все закладки, заметки и цитаты на основе поля _date_created_, затем доставить в шаблон как один повторяемое. Это для игрушки/самостоятельного изучения проекта, так что я действительно не нужно беспокоиться о масштабе.

Этот подход я взял это:

from operator import attrgetter

from app.models import Url, Note, Quote

date_dict = {}

for url in Url.objects.filter(user=request.user):
    date_dict[url.date_created] = Url.objects.get(date_created=url.date_created)

for note in Note.objects.filter(user=request.user):
    date_dict[note.date_created] = Note.objects.get(date_created=note.date_created)

for quote in Quote.objects.filter(user=request.user):
    date_dict[quote.date_created] = Quote.objects.get(date_created=quote.date_created)

my_query = sorted((date_dict[i] for i in date_dict.iterkeys()), 
                  key=attrgetter("date_created"), 
                  reverse=True)

Я также попытался это:

from operator import attrgetter
from itertools import chain

from app.models import Url, Note, Quote

items = sorted(chain(Url.objects.filter(user=request.user), 
                     Note.objects.filter(user=request.user), 
                     Quote.objects.filter(user=request.user)), 
               key=attrgetter("date_created"), 
               reverse=True)

Я понимаю, как дорого это будет сделать, если я имел огромные наборы данных (я не знаю), но из того что я читал второй-быстрее.

Этот код работает и делает то, что я ожидаю, но есть ли лучше/быстрее подход?



3824
3
задан 8 марта 2011 в 05:03 Источник Поделиться
Комментарии
1 ответ

Редактировать удалить предыдущую версию, которая была практически говорим, что вы используете второй метод, показанный выше. Первый способ загружает все из базы данных дважды. (Джанго может сделать некоторые кэширования, но все же) я не уверен, почему вы ставите все в словаре.

Проблема с текущей реализации является то, что сортировка производится с помощью Python, а затем в базу данных. Было бы лучше, чтобы сделать сортировку в базе данных. Есть два пути я вижу это.


  1. Вы могли бы иметь три различных источников, отсортированные по базе данных. Затем можно выполнить слияние пройти, чтобы объединить их. Однако, вы, вероятно, будете иметь, нужно много данных, прежде чем это становится целесообразным. Сортировка будет implemently в C ++ для Python, который будет делать это преимущества в скорости над слиянием которые нужно реализовать в Python.

  2. Вы могли бы перепроектировать базу данных URL-адресов, цитаты, и заметки хранятся в той же таблице. Таким образом, вы могли бы запросить базу данных, чтобы отсортировать их.

Обе эти стратегии действительно только полезно, если вы в конечном итоге с большим количеством данных. Если у вас есть столько данных, вы не собираетесь хотите представить все это в любом случае пользователей. Результатом является то, что его, наверное, не полезно.

1
ответ дан 8 марта 2011 в 05:03 Источник Поделиться