Django - фильтрация на связанных объектах

Отключите звук с микрофона и подключите устройство к внешнему источнику звука (например, к наушникам).

18
задан Tim Graham 2 November 2008 в 00:43
поделиться

4 ответа

filter метод для фильтрации, какие объекты возвращаются на основе указанных критериев, таким образом, это не то, что Вы хотите здесь. Одна опция состоит в том, чтобы сделать второй запрос для получения всех оценок для, учитывая Event объекты для тока User.

Модели:

import collections

from django.db import models

class RatingManager(models.Manager):
    def get_for_user(self, events, user):
        ratings = self.filter(event__in=[event.id for event in events],
                              user=user)
        rating_dict = collections.defaultdict(lambda: None)
        for rating in ratings:
            rating_dict[rating.event_id] = rating
        return rating_dict

class Rating(models.Model):
    # ...
    objects = RatingManager()

Представление:

events = Event.objects.all()
user_ratings = Rating.objects.get_for_user(events, request.user)
context = {
    'events': [(event, user_ratings[event.id]) for event in events],
}

Шаблон:

{% for event, user_rating in events %}
  {% if user_rating %} ... {% endif %}
{% endfor %}
16
ответ дан 30 November 2019 в 08:59
поделиться

В дополнение к предложению S.Lott можно рассмотреть использование select_related () для ограничения количества запросов базы данных; иначе Ваш шаблон сделает, запрос на каждом событии проходит через цикл.

Event.objects.all().select_related(depth=1)

параметр глубины не требуется, но если Ваши другие модели будут иметь дополнительные внешние ключи, то он ограничит количество соединений.

4
ответ дан 30 November 2019 в 08:59
поделиться

Для лучшего использования Django необходимо постараться не пытаться сделать соединения.

А "уехал, внешнее объединение" является на самом деле списком объектов с дополнительными отношениями.

Это - просто список Событий, Event.objects.all(). Некоторые Объекты-события имеют оценку, некоторые не делают.

Вы получаете список Событий в Вашем представлении. Вы обрабатываете дополнительные отношения в своем шаблоне.

{% for e in event_list %}
    {{ e }}
    {% if e.rating_set.all %}{{ e.rating_set }}{% endif %}
{% endfor %}

точка атаки.

1
ответ дан 30 November 2019 в 08:59
поделиться

Думаю, тебе нужно сделать что-то вроде этого.

events=Event.objects.filter(rating__user=request.user.id)
ratings='(select rating from ratings where user_id=%d and event_id=event_events.id '%request.user.id
events=events.extra(select={'rating':ratings})
-1
ответ дан 30 November 2019 в 08:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: