Запрос в Django для сортировки в одной таблице на основе результата другой таблицы
У меня есть две модели модель листинга:
class listing(models.Model):
productTitle= models.CharField(max_length=60)
description = models.TextField()
category = models.ForeignKey(category,on_delete=models.CASCADE,null=True)
productPrice = models.FloatField(default=0.0)
def __str__(self):
return self.productTitle
модель моего списка часов:
item = models.ForeignKey(listing, on_delete= models.CASCADE)
watchlist = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.item
В моем файле index.html Я хочу показать элемент списка, если атрибут watchlist равен False.
Теперь мой views.py для index.html выглядит следующим образом:
def index(request):
if request.user != "AnonymousUser":
items= listing.objects.exclude(id=watchlist.objects.filter(user=request.user))
else:
items = watchlist.objects.all()
context = {'items':items}
return render(request, "auctions/index.html", context)
Я не смог отфильтровать элементы в модели листинга на основе результата модели watchlist, т.е. если watchlist=True, то я не хочу выводить элементы на index.html. Потому что я хочу выводить элементы watchlist на отдельных страницах. Как сделать запрос в django, если используются две модели?
Вы, вероятно, могли бы сделать что-то вроде этого
watch_list = watchlist.objects.filter(wishlist=False, user=request.user.id).values('item')
Затем, если вы хотите получить элементы, вы делаете следующее
items = listing.objects.filter(id__in=watch_list)
from django.db.models import Q
items = listing.objects.filter(watchlist__isnull=True) | listing.objects.filter(Q(watchlist__user=request.user) & Q(watchlist__watchlist=False))
Если я правильно понимаю, вам нужно перечислить элементы, которых нет в таблице watchlist. Вы можете использовать обратное отношение в запросе. watchlist__isnull=True предназначен для перечисления записей, отсутствующих в таблице watchlist. Вторая часть listing.objects.filter(Q(watchlist__user=request.user) & Q(watchlist__watchlist=False) является фильтром списка часов