Как осуществить обратную проверку существования объекта в много-ко-многим 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].

Вернуться на верх