Django GenericForeignKey поиск для данной модели - PullRequest
3 голосов
/ 26 декабря 2011

Я использую приложение для голосования (django-rating, если это имеет какое-то значение), которое использует GenericForeignKey django, имеет ForeignKey to User и несколько других полей, таких как дата последнего изменения.

Я хотел бы получить все объекты одного типа контента, за которые проголосовал один пользователь, упорядоченные по дате последнего изменения. Насколько я понимаю, вся информация может быть найдена в одной таблице (кроме content_type, который может быть предварительно выбран / кэширован). К сожалению, django по-прежнему делает дополнительный запрос каждый раз, когда я запрашиваю content_object.

Итак, вопрос в том, как мне получить все голоса по данной модели, заданным пользователем, со связанными объектами и заданным порядком с минимальными попаданиями в базу данных?

Редактировать: сейчас я использую 2 запроса - сначала выбираю все голоса, получаю все нужные мне объекты, фильтрую по .filter (pk__in = obj_ids) и, наконец, заполняю их объектами голосования. Но, похоже, обратное родовое отношение может помочь решить проблему

Ответы [ 3 ]

0 голосов
/ 26 декабря 2011

Посмотрев на models.py приложения django-Rating , я думаю, что вам нужно будет сделать user.votes.filter(content_type__model=Model._meta.module_name).order_by("date_changed") (при условии, что модель, по которой вы хотите фильтровать, Model), чтобы получить всеVote объекты.Для связанных объектов переберите набор запросов, получая content_object для каждого элемента.ИМХО, это приведет к наименьшему количеству запросов к БД.

0 голосов
/ 29 декабря 2011

Хорошо, сейчас мы используем prefetch_related () из django 1.4 для GenericRelation.Он по-прежнему использует 2 запроса, но имеет интуитивно понятный интерфейс.

0 голосов
/ 26 декабря 2011

Вы проверили select_related()?Это может помочь.

Возвращает QuerySet, который будет автоматически «следовать» отношениям внешнего ключа, выбирая эти дополнительные данные связанного объекта при выполнении своего запроса.Это повышение производительности, которое приводит к (иногда значительно) большим запросам, но означает, что дальнейшее использование отношений внешнего ключа не потребует запросов к базе данных.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

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