Получение данных из моделей с помощью 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 в функцию рендеринга в качестве контекстной переменной. Посмотрите это краткое руководство о том, как передавать данные в шаблоны.

Вернуться на верх