Получить записи, присоединившись к трем таблицам, которых нет в другой таблице - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь получить записи из таблицы Student, условие состоит в том, что первичный ключ студента не существует в таблице From. (From используется как отношение). Отношение "студент с кафедры"

Модель:

class Student(models.Model):
    name = models.CharField(max_length=20)
    password = models.CharField(max_length=30)
    phone_no = PhoneNumberField(null=False, blank=False, unique=True)
    email = models.EmailField()
    pic_location = models.FileField()
    username = models.CharField(max_length=30)

class From(models.Model):
    s = models.ForeignKey(Student, on_delete=models.PROTECT)
    d = models.ForeignKey(Department,on_delete=models.PROTECT)

class Department(models.Model):
    name = models.CharField(max_length=20)
    password = models.CharField(max_length=30)
    phone_no = PhoneNumberField(null=False, blank=False, unique=True)
    email =  models.EmailField()

Я пытаюсь получить эти записи в виде списка. И, пожалуйста, проверьте, насколько хорошо в этом случае я получаю переменную сеанса ??

class PendingStudent(ListView):
# Students pending for department approval
    context_object_name = 'pending_students'
    model = From
    template_name = "admin_panel/department/student_detail.html"

    def get_queryset(self):
        department = self.request.session.get('username')
        return From.objects.filter(~Q(d__name==department))

Я использовал сеанс, чтобы сохранить тип пользователя, вошедшего в систему (студент / учитель / отдел).

1 Ответ

0 голосов
/ 05 июня 2019

Похоже, вы хотите вернуть набор запросов, который исключает определенные значения. Для этого я бы использовал .exclude() вместо filter, так как это более явно. Вы можете проверить, что здесь

def get_queryset(self):
    department = self.request.session.get('username')
    queryset = From.objects.exclude(d__name=department)
    # In order to print the SQL query you can do this below
    # print(queryset.query.__str__())
    return queryset

Однако, если вы хотите вернуть много студентов, которых нет в таблице «Из таблицы», вы можете сделать что-то вроде:

def get_queryset(self):
    return Student.objects.filter(from__d__isnull=True)

Вы можете проверить, что здесь

...