【问题标题】:How to reverse check if object exisit in many to many django?如何反向检查对象是否存在于多对多 django 中?
【发布时间】:2021-11-12 03:38:00
【问题描述】:

我有两个模型:

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 %}

它没有按我预期的方式工作!请指导

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    您可以通过使用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(
            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 decorator [Django-doc].

    【讨论】:

    • 天哪,我无法理解注释 - 反向查找这么难吗?
    • @sixovov947: 不过滤,但在这里我们做一个子查询来检查是否有学生愿望清单,用户为request.sueruniversity_idUniversity 的主键。
    • 什么是“OuterRef”,做子查询被认为是一个额外的查询,它的效率高吗?
    • @sixovov947:没有子查询是查询的一部分,所以所有的工作都由数据库完成,而不是来自 Django 的额外查询。 OuterRef 指的是不属于子查询的字段,而是外部查询(所以这里是University 模型的查询,因此我们参考University 的主键,我们确定是否帖子被点赞了)。
    • 它给出一个错误“'Exists'对象没有属性'filter'”
    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多