0

У меня есть модель «Бронирование», ссылающаяся на другую модель «Событие» с внешним ключом.Django: как эффективно обращаться к отношениям

class Event(models.Model): 
    title = models.CharField(_("title"), max_length=100) 

class Booking(models.Model): 
    user = models.ForeignKey('auth.User', ..., related_name='bookings') 
    event = models.ForeignKey('Event', ..., related_name='bookings') 

Я хочу, чтобы все события, пользователь заказанные в наборе, чтобы использовать его в ListView.

мне удалось добиться этого путем перезаписи метод get_queryset ListView в:

def get_queryset(self): 
    user_bookings = Booking.objects.filter(user=self.request.user) 
    events = Event.objects.filter(id__in=user_bookings.values('event_id')) 
    return events 

Но я совершенно уверен, что это не очень эффективный способ решения моей проблемы, с точки зрения необходимых запросов к базе данных.

Я подумал об использовании метода «select_related», но я не понял, как я мог бы извлечь из этого выгоду из моего использования.

Мой вопрос: Как бы вы решили это? Каков наиболее эффективный способ сделать что-то подобное?

ответ

2

Вы можете сделать это в одной строке: Event.objects.filter(bookings__user=self.request.user)

+0

Это уборщик подход, спасибо. Я добавил «.distinct()» в конце, чтобы получать события только один раз. Но эффективна ли она с точки зрения запросов? можете ли вы рассказать мне, сколько запросов это произведет? – setchock

+0

Ах да, может потребоваться отличная там. Это единственный запрос, вы можете увидеть его с помощью 'print Event.objects.filter (bookings__user = self.request.user) .query'. –