在 Django 中使用 OneToOneField 从模型中获取数据

Fetching data from models using OneToOneField in Django

好吧,我的大学让我们去学习一个框架,并在一个月内用它制作一个网站,这真的让我很伤心,因为我无法像现在这样真正理解 Django 框架在观看 YouTube 视频和阅读文档时取得进步。 无论如何,我的模型都搞砸了,这让工作变得更加困难,每当我解决一个问题时,另一个问题就会出现,但截止日期已经临近,对模型进行任何更改都会花费我大量的时间。这次我的问题是关于获取数据。 涉及机型如下:

用于身份验证的用户class

class User(AbstractBaseUser, PermissionsMixin):
    id = models.AutoField(primary_key=True,null=False)
    username = models.CharField(max_length=50)
    email = models.EmailField(unique=True)
    nom = models.CharField(max_length=255)
    prenom = models.CharField(max_length=255)
    usertype = models.CharField(choices=types,max_length=20,default="user")
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    student_data = models.OneToOneField(Etudiant, on_delete=models.CASCADE,blank=True, null=True,related_name='Etudiant_access')
    Prof_data = models.OneToOneField(Prof, on_delete=models.CASCADE,blank=True, null=True)
    objects=UserManager()

    def __str__(self):
        return  self.prenom + " " + self.nom 

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

学生(Etudiant) class 管理学生:

class Etudiant(models.Model):
    filiere = models.ForeignKey(Filiere, on_delete=models.DO_NOTHING)
    classe = models.ForeignKey(Classe,null=True, on_delete=models.DO_NOTHING)
    notes = models.ManyToManyField(note,blank=True, null=True)

用于管理不同 classes 的 class 类 (LMAO):

class Classe(models.Model):
    #Cla_id = models.AutoField(primary_key=True, null=False)
    Designation = models.CharField(max_length=100)
    filiere = models.ForeignKey(Filiere, on_delete=models.CASCADE)
    Epreuve = models.ManyToManyField(Epreuve,blank=True, null=True)
    def __str__(self):
        return self.Designation

问题是我想获取学生用户的所有数据(这意味着他们的 Prof_data 属性是 blank/null 并且他们的 student_data 属性指向 Etudiant(Student) class 而 Etudiant.classe 属性等于视图参数中的值

我已经解决了很多问题,但我还是卡在了最后 这是我的视图函数:

@login_required
def class_info(request,design):
    
#getting the Classe(s) from the url which Designation == design
    classe_now = Classe.objects.get(Designation=design)
    print(classe_now) # This works like a charm
    
#getting the Students objects that are part of the class_now
    Etudiants = Etudiant.objects.filter(classe=classe_now)
    print(Etudiants) # This works too. It returns the 'Etudiant' objects from where i wanna access to the Users data
    
#getting the User data of the student objects (This is where i get confused)
    students_to_show = User.objects.filter(student_data=Etudiants)
    pprint(students_to_show)
    
    return render(request, 'Prof/class_info.html')

我真的很困惑,你真的是我最后的希望,谢谢你的时间。

您可以通过选择所有与 Prof 模型有 empty/null 关系且与 Etudiant 模型没有 empty/null 关系的用户来过滤您的 User 模型。

student_users = User.objects.filter(Prof_data__isnull=True, student_data__isnull=False)

然后对于每个 stident_user,您可以通过以下方式获取其学生数据:

student_user = student_users[0]
student_user.student_data.filiere
student_user.student_data.classe
student_user.student_data.notes

然后您可以将查询集结果作为上下文变量传递给呈现函数。查看 this 关于如何将数据传递到模板的简短教程。