Ссылка двух моделей - PullRequest
       7

Ссылка двух моделей

0 голосов
/ 02 апреля 2019

У меня есть две модели: профиль и курс.Профиль хранит информацию о пользователе.Курс имеет название, описание и дату.Пользователь может записаться на курс по ссылке.Моя цель - составить список пользователей, принадлежащих к каждому курсу.

Я пытался использовать ForeignKey, но мне нужно добавить пользователя в список только после того, как он подпишется на него.

class Course(models.Model):
course_title = models.CharField(max_length=200)
course_description = models.TextField()
course_published = models.DateTimeField("date published", default = datetime.now())
course_users = []
def __str__(self):
    return self.course_title

def course_signup(request):
# here i guess i need to somehow add the user to the list
Course.course_users.append(Profile.id)
return redirect("main:homepage")

Код профиля:

class Profile (models.Model):
user=models.OneToOneField(User, on_delete=models.CASCADE)
image=models.ImageField(default='default.jpg',upload_to='profile_pics')
def __str__(self):
    return f'{self.user.username} Profile'

def save(self, *args, **kwargs):
    super(Profile,self).save(*args,**kwargs)
    img = Image.open(self.image.path)

    if img.height > 300 or img.width >300:
        output_size = (300,300)
        img.thumbnail(output_size)
        img.save(self.image.path)

Я ожидаю, что в курсе будет список пользователей.

1 Ответ

1 голос
/ 02 апреля 2019

Это просто отношение многие ко многим (м2м). Вы можете использовать ManyToMany() часть Django или создать свои собственные отношения, например:

class ProfileCourse(models.Model):
    profile = models.ForeignKey(Profile)
    course = models.ForeignKey(Course)

так что вы можете записать профиль в курс с:

def course_signup(request):
     profile = [snip....]
     course = [snip...]
     ProfileCourse(profile=profile, course=course).save()

Одним из реальных преимуществ управления собственными отношениями с m2m является то, что вы можете добавить дополнительную информацию к отношениям. В этом случае вы можете добавить «final_grade».

Еще одна вещь ... отношения m2m часто просто называют в честь двух сторон отношения (например, ProfileCourse), , если не существует другого хорошего слова (например, "Регистрация"), которое существует для описания отношения.

...