Получение данных из моделей с помощью OneToOneField в Django
В моем колледже нас заставляют изучать фреймворк и делать сайт на нем за месяц, и это меня просто убивает, из-за этого я не смог хорошо понять фреймворк Django, так как я продвигаюсь вперед, смотря видео на YouTube и читая документацию. В любом случае, мои модели все перепутаны, что еще больше усложняет работу, и каждый раз, когда я решаю одну проблему, возникает другая, но срок уже близок, и внесение любых изменений в модели будет стоить мне много времени. На этот раз моя проблема связана с получением данных. Речь идет о следующих моделях:
Класс User для аутентификации
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']
Класс Students (Etudiant) для управления студентами:
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)
Класс Classe (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 пуст/null, а их атрибут student_data указывает на класс Etudiant(Student), имея атрибут 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')
Я действительно запутался, вы действительно моя последняя надежда в этом, и спасибо за ваше время.
Вы можете отфильтровать вашу User
модель, выбрав всех пользователей, которые имеют пустое/нулевое отношение к модели Prof и непустое/нулевое отношение к модели Etudiant.
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
Затем вы можете передать результат queryset в функцию рендеринга в качестве контекстной переменной. Посмотрите это краткое руководство о том, как передавать данные в шаблоны.