Вызов функции класса внутри функции другого класса

Я пытаюсь создать образовательный сайт с помощью 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
Вернуться на верх