У меня есть модель «Бронирование», ссылающаяся на другую модель «Событие» с внешним ключом.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», но я не понял, как я мог бы извлечь из этого выгоду из моего использования.
Мой вопрос: Как бы вы решили это? Каков наиболее эффективный способ сделать что-то подобное?
Это уборщик подход, спасибо. Я добавил «.distinct()» в конце, чтобы получать события только один раз. Но эффективна ли она с точки зрения запросов? можете ли вы рассказать мне, сколько запросов это произведет? – setchock
Ах да, может потребоваться отличная там. Это единственный запрос, вы можете увидеть его с помощью 'print Event.objects.filter (bookings__user = self.request.user) .query'. –