sqlite Django:与访问数据库模型的外键数据混淆

1cklez4t  于 2023-01-31  发布在  SQLite
关注(0)|答案(2)|浏览(134)

这是我第一次使用Django,在工作中我遇到了一个困惑,那就是如何在视图中创建一个特定的语句来得到我想要的输出。我创建了一个模型'Parents',它包含了一个特定学生的数据(外键),并且我不知道如何访问该学生ID以进行进一步的处理(如使用Attendance),或结果,该特定的学生。下面是必要的代码和我的试验,以获取数据。
Models.py

class Students(models.Model):
    id = models.AutoField(primary_key=True)
    admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    gender = models.CharField(max_length=50)
    address = models.TextField()
    course_id = models.ForeignKey(Courses, on_delete=models.DO_NOTHING, default=1)
    session_year_id = models.ForeignKey(SessionYearModel, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = models.Manager()

    def __str__(self):
        return self.admin.first_name + " " + self.admin.last_name

class Parents(models.Model):
    id = models.AutoField(primary_key=True)
    admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    gender = models.CharField(max_length=50)
    **student = models.ForeignKey(Students, on_delete=models.CASCADE)**
    relation = models.CharField(max_length=255)
    address = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = models.Manager()

    def __str__(self):
        return self.admin.first_name + " " + self.admin.last_name

这里我有两个模型,Students模型包含有关学生的所有信息,另一个模型是Parent模型,它包含带有特定学生ID的家长信息。
下面是视图文件代码,我试图获取当前登录家长的学生ID,

def HOME(request):
    stud_data = Parents.objects.filter(student__id = request.user.id)
    print(stud_data)
    return None

在页面重新加载时,我能够得到一个空的QuerySet[],因为它无法找到ID。
请帮助我找到这个问题的解决方案,这样我就可以继续思考发展。
谢谢:)

z31licg0

z31licg01#

正如您在这里提到的,您正在查找当前登录的Parent的学生数据。因此,您可以直接从Parent对象查找学生数据。如下所示:

stud_object = request.user.parent.student

这个关系起作用是因为Parent与CustomUser有一个OneToOne关系(我假设Authentication的自定义User模型),因此您应该从request.user.parent获取Parent对象(OneToOne的反向关系)。

此外,我认为父母和学生之间的关系应该是ManyToMany,因为一个学生可以有多个父母,一个父母可以有多个学生(或孩子)。

erhoui1w

erhoui1w2#

有两种可能性:
1.您附加的View代码应该返回stud_data而不是None,但我假设您知道这一点,并且代码的当前状态只是用于调试目的。

  1. request.user.id包含了一个不属于数据库中任何学生ID的值。因为你使用的是filter,它不会对此进行抱怨,只会返回一个空的QuerySet。我建议在这里使用get()过滤器,它会引发DoesNotExist异常,也会有助于调试。
def home(request):
    stud_data = Parents.objects.get(student__id = request.user.id)
    return stud_data

希望能有所帮助!
祝你在新的旅程中好运!

相关问题