Django Модельные запросы с отношениями. Как сделать правильное соединение
Допустим, у меня есть 2 модели:
class Auction(models.Model):
seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name="seller")
title = models.CharField(max_length=64)
class Watchlist(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_watchlist')
auction = models.ForeignKey(Auction, on_delete=models.CASCADE, related_name='auction_watchlist')
Представление получает запрос, создает контекстную переменную с объектами аукциона, которыми являются:
- связанные с пользователем, который сделал запрос, и
- которые были добавлены в модель списка наблюдения,
отправляет его в шаблон.
Я настроил свое представление для работы следующим образом:
@login_required
def watchlist(request):
watchlist_objects = Watchlist.objects.filter(user=request.user)
auction_objects = Auction.objects.filter(auction_watchlist__in=watchlist_objects).all()
context = {'watchlist_auctions': auction_objects}
print(context)
return render(request, "auctions/watchlist.html", context)
Я делаю первый запрос, чтобы получить список элементов в списке часов, связанных с пользователем.
Затем я использую это для получения другого запроса из модели аукциона и передаю его в шаблон.
В шаблоне я могу получить доступ к атрибутам Auction, чтобы отобразить их. (название, автор и другие, которые я не включил для простоты)
Вопрос в следующем: Является ли это "правильным способом? Есть ли лучший способ получить доступ к атрибутам в Auction из первого запроса Watchlist?
Мне кажется, что я делаю что-то слишком сложное.
Это не так уж плохо, учитывая, что он, вероятно, будет выполнен как один запрос, из-за ленивых оценок кверисетов. Вы можете пропустить .all()
, если у вас уже есть .filter()
.
Однако есть более удобный способ сделать это, используя lookups, которые охватывают отношения.:
auction_objects = Auction.objects.filter(auction_watchlist__user_id=request.user.id)