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')

Представление получает запрос, создает контекстную переменную с объектами аукциона, которыми являются:

  1. связанные с пользователем, который сделал запрос, и
  2. которые были добавлены в модель списка наблюдения,

отправляет его в шаблон.

Я настроил свое представление для работы следующим образом:

@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)
Вернуться на верх