【问题标题】:Get the records by joining three table that are not in another table通过加入三个不在另一个表中的表来获取记录
【发布时间】:2019-06-05 12:26:37
【问题描述】:

我正在尝试从 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))

我使用了 session,来存储登录的用户类型(学生/教师/部门)。

【问题讨论】:

    标签: django session join orm relation


    【解决方案1】:

    您似乎想返回一个排除某些值的查询集。为此,我会使用.exclude() 而不是filter,因为它更明确。 你可以检查here

    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
    

    但是,如果您想返回许多不在 From 表中的学生,您可以执行以下操作:

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

    您可以查看here

    【讨论】:

    • 对于第二种情况,我需要将模型设置为学生?列表视图能否返回与 model 中的模型不相似的模型。
    • 如果你覆盖 get_queryset 你可以传递任何你想要的模型。如果您不覆盖该方法,那么 Django 将使用您在上面提供的方法。无论如何,最好把模型换成model = Student
    • 谢谢!!自 12 小时以来一直在挖掘这个问题。
    • 能否提供SQL等效代码。
    • @SuryaBhusal 如果将查询集分配给变量,则可以打印 SQL 查询。我将编辑我的答案,以便您查看。
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 2011-07-10
    • 1970-01-01
    • 2010-12-31
    • 2013-01-10
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多