Фильтрация представления на основе пользовательских разрешений - PullRequest
1 голос
/ 19 мая 2019

У меня есть 2 модели, одна для списка курсов, а другая со списком заявок для каждого пользователя.

Таблица регистрации в настоящее время структурирована так, чтобы иметь только 1 запись на каждого учащегося В таблице регистрации есть ManytoManyField, позволяющий добавить несколько курсов для каждого учащегося.

Я хочу убедиться, что когда Студент входит в систему, он видит только те курсы, на которые он записан. Я не могу понять, какой запрос в представлении является наиболее подходящим для достижения этой цели.

models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Course(models.Model):
    title           = models.CharField(max_length=255)
    description     = models.TextField()
    created_dt      = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

class Enrollment(models.Model):
    student = models.ForeignKey(User,on_delete=models.CASCADE)
    course = models.ManyToManyField(Course)

    def __str__(self):
        return f"{self.student}'s Enrollments"

views.py

from django.shortcuts import render,get_object_or_404
from django.http import HttpResponse
from .models import Course,Step,Enrollment
from django.http import Http404
from django.contrib.auth.decorators import login_required

@login_required
def course_list(request):
    #courses = Course.objects.all()

    courses = Course.objects.filter(id in Enrollment.objects.filter(student=request.user))

    return render(request,"courses/course_list.html",{'courses':courses})

1 Ответ

0 голосов
/ 19 мая 2019

Я не уверен, что моделирование Enrollment имеет здесь большой смысл, поскольку в основном вы здесь создаете дополнительную таблицу. Было бы более разумно видеть Enrollment себя как отношение «многие ко многим» между Course и User, например:

from django.contrib.auth import <b>get_user_model</b>

class Course(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField()
    created_dt = models.DateTimeField(auto_now_add=True)
    <b>enrollment = models.ManyToManyField(get_user_model())</b>

    def __str__(self):
        return self.title

Если позднее вы захотите указать некоторые дополнительные свойства для набора (курс, пользователь), вы можете указать параметр through [Django-doc] .

Затем мы можем получить список курсов:

@login_required
def course_list(request):
    <b>courses = Course.objects.filter(enrollment=request.user)</b>
    return render(request,"courses/course_list.html", {'courses':courses})

Если вы продолжаете использовать оригинальное моделирование, мы можем отфильтровать с помощью:

@login_required
def course_list(request):
    <b>courses = Course.objects.filter(enrollment__student=request.user)</b>
    return render(request,"courses/course_list.html", {'courses':courses})

но это моделирование делает вещи немного "слишком сложными".

Примечание : если вы ссылаетесь на модель пользователя, рекомендуется использовать get_user_model [Django-doc] вместо User напрямую, так как если вы позже внедрите пользовательскую модель клиента, вам будет сложно все изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...