Вызов функции класса внутри функции другого класса
Я пытаюсь создать образовательный сайт с помощью django, поэтому у меня есть модель class
и модель course
. Я пытался использовать отношения Many-to-one
foreignkey
, но это не работает, я могу создавать классы с помощью foreignkey
, но этот класс не назначается только этому курсу. Он появляется и в других курсах. Как я могу заставить это работать? Что я должен изменить?
Мой models.py:
class Class(models.Model):
title = models.CharField(max_length=100)
video = models.FileField(upload_to='class/class_videos',null=True,
validators=[FileExtensionValidator(allowed_extensions=['MOV','avi','mp4','webm','mkv'])])
def __str__(self):
return self.title
class Course(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='class/instructor_pics', null=True)
instructor = models.CharField(max_length=100)
instructor_image = models.ImageField(upload_to='class/instructor_pics', null=True)
students = models.ManyToManyField(User, related_name='courses_joined', blank=True)
classes = models.ForeignKey(Class, on_delete=models.CASCADE, null=True)
slug = models.SlugField(max_length=200, unique=True)
description = models.TextField(max_length=300, null=True)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created']
def __str__(self):
return self.title
Вы используете внешний ключ в неправильной модели. Если каждый класс может иметь только один курс, а один курс может иметь несколько классов, вы должны поместить ForeignKey в модель класса, а не в модель курса. Ваш код будет выглядеть следующим образом:
class Course(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='class/instructor_pics', null=True)
instructor = models.CharField(max_length=100)
instructor_image = models.ImageField(upload_to='class/instructor_pics', null=True)
students = models.ManyToManyField(User, related_name='courses_joined', blank=True)
slug = models.SlugField(max_length=200, unique=True)
description = models.TextField(max_length=300, null=True)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created']
def __str__(self):
return self.title
class Class(models.Model):
title = models.CharField(max_length=100)
video = models.FileField(upload_to='class/class_videos',null=True,
validators=[FileExtensionValidator(allowed_extensions=['MOV','avi','mp4','webm','mkv'])])
course = models.ForeignKey(Course, on_delete=models.CASCADE, null=True, related_name='classes')
def __str__(self):
return self.title
А когда вы хотите перечислить классы одного курса, вы можете использовать этот код (вы должны использовать поле related_name
в модели источника так же, как я использовал в модели класса):
course = Course.objects.filter(some_filter=some_value).first()
course.classes.first() # This will return the first class of the course