首页 > 解决方案 > 检查Django的ManyToManyField中是否存在用户类型?

问题描述

我有一个课程模型,其中包含一个创建课程的用户并包含一个enrolledManyToManyField,它允许用户注册课程。

class Course(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='course_owner')
    enrolled = models.ManyToManyField(User)
    ...

用户模型包含两种类型 - 教师(创建课程)和学生(注册)

class User(AbstractUser):
    is_student = models.BooleanField(default=True)
    is_teacher = models.BooleanField(default=False)

我想要一个 MyCourses 视图,教师可以在其中查看他的 created_courses,学生可以查看他注册的课程。

def MyCourses(request):
    user = request.user
    courses = Course.objects.filter(user=user)

    context = {
        'courses': courses
    }

    return render(request, 'classroom/mycourses.html', context)

这适用于教师部分,但我如何检查学生是否注册了该课程?

谢谢。

标签: djangodjango-models

解决方案


您可以添加额外条件并使用逻辑或:

from django.db.models import Q

def MyCourses(request):
    user = request.user
    courses = Course.objects.filter(Q(user=user) | Q(enrolled=user))

    context = {
        'courses': courses
    }

    return render(request, 'classroom/mycourses.html', context)

为防止Course多次加载相同的内容,您可以使用.distinct()[Django-doc]

from django.db.models import Q

def MyCourses(request):
    user = request.user
    courses = Course.objects.filter(Q(user=user) | Q(enrolled=user)).distinct()

    context = {
        'courses': courses
    }

    return render(request, 'classroom/mycourses.html', context)

推荐阅读