如何反向检查对象是否存在于多对多 django 中?

How to reverse check if object exisit in many to many 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 %}

它没有像我预期的那样工作!请指导

您可以通过用 Exists subquery [Django-doc] 注释 Universities 来检查那个人是否喜欢大学:

from django.contrib.auth.decorators import login_required
from django.db.models import Exists, OuterRef

@login_required
def index(request):
    universities = University.objects.annotate(
        <strong>liked=Exists(</strong>Student.wishlist.through.objects.filter(
            student=request.user, university_id=OuterRef('pk')
        <strong>))</strong>
    ).filter(is_approved=True)
    context = {'universities': universities}
    return render(request, 'search/index.html', context)

如果Student是用户模型。如果不是这种情况,您首先应该获取登录用户,并在 .filter(student=…, …) 部分使用它。

然后我们可以在模板中渲染它:

{% for university in universities %}
    {{ university }}
    {% <strong>if university.liked</strong> %}
        <button><em class="icon ni ni-heart-fill" ></em></button>
    {% else %}
         <button><em class="icon ni ni-heart"></em></button>
    {% endif %}
{% endfor %}

Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].