在 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 关于如何将数据传递到模板的简短教程。
好吧,我的大学让我们去学习一个框架,并在一个月内用它制作一个网站,这真的让我很伤心,因为我无法像现在这样真正理解 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 关于如何将数据传递到模板的简短教程。