Как осуществить обратную проверку существования объекта в много-ко-многим django?
У меня есть две модели:
Model Student:
name = models.CharField()
..... ....
wishlist = models.ManyToManyField(University, blank=True)
Model University:
name = models.CharField()
...... . .. . . . .
В основном я просто создаю список желаний, с помощью которого пользователь может поставить лайк на университет и затем добавить его в свой список желаний! (я выражаю это через иконку сердца), Так что когда пользователь нажмет на тот же элемент, он удалит его из списка желаний, вот и все!
Проблема заключается в том, как проверить, понравился ли пользователю определенный университет?
вот мой код:
def index(request):
univesity = University.objects.filter(is_approved=True)
context = {'univesity': univesity}
return render(request, 'search/index.html', context)
Выше я получаю все университеты для поиска! Здесь мне нужно проверить, добавил ли пользователь уже университет в список желаний. И если это так, то значок сердца станет красным, иначе пустым !
А теперь вот как я показываю на шаблоне
{% if data.student_set.all %}
<button><em class="icon ni ni-heart-fill" ></em></button>
{% else %}
<button><em class="icon ni ni-heart"></em></button>
{% endif %}
Это не работает так, как я ожидал! Пожалуйста, подскажите
Вы можете проверить, понравился ли этому человеку университет, аннотировав Universities
подзапросом Exists
[Django-doc]:
from django.contrib.auth.decorators import login_required
from django.db.models import Exists, OuterRef
@login_required
def index(request):
universities = University.objects.annotate(
liked=Exists(Student.wishlist.through.objects.filter(
student=request.user, university_id=OuterRef('pk')
)
)).filter(is_approved=True)
context = {'universities': universities}
return render(request, 'search/index.html', context)
Если Student
является моделью пользователя. Если это не так, то сначала нужно получить зарегистрированного пользователя и использовать его в части .filter(student=…, …)
.
Затем мы можем отобразить это в шаблоне следующим образом:
{% for university in universities %}
{{ university }}
{% if university.liked %}
<button><em class="icon ni ni-heart-fill" ></em></button>
{% else %}
<button><em class="icon ni ni-heart"></em></button>
{% endif %}
{% endfor %}
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_required
декоратора [Django-doc].