Estoy tratando de crear un sitio web en el que los usuarios puedan agregar los cursos que están tomando. Quiero saber cómo debo agregar la relación ManyToMany. De modo que podamos incluir a todos los usuarios en un curso según el código del curso, el instructor o cualquier campo. Y también podemos obtener los cursos en los que está inscrito el usuario. Actualmente, la estructura de mi base de datos es:
class Course(models.Model): course_code = models.CharField(max_length=20) course_university = models.CharField(max_length=100) course_instructor = models.CharField(max_length=100) course_year = models.IntegerField(('year'), validators=[MinValueValidator(1984), max_value_current_year]) def __str__(self): return self.course_codey mi modelo de usuario:
class Profile(AbstractUser): bio = models.TextField() image = models.ImageField(default='defaults/user/default_u_i.png', courses = models.ManyToManyField('home.Course',related_name='courses') def __str__(self): return self.usernameMe preguntaba si la relación ManyToMany debería estar en el modelo de usuario o en el modelo de curso. ¿O hará alguna diferencia en absoluto?
EDITAR : para agregar un curso al objeto de publicación ahora estoy usando esta vista, pero parece que no funciona:
@login_required def course_add(request): if request.method == "POST": form = CourseForm(request.POST or none) if form.is_valid(): course = form.save() request.user.add(course) else: form = CourseForm context = { 'form':form } return render(request,'home/courses/course_add.html', context)Para bases de datos relacionales, el modelo en el que defina ManyToManyField no importa. Django creará una tabla adicional con dos ForeignKey s para los dos modelos que están vinculados por ManyToManyField .
Los administradores relacionados que se agregan, etc. son toda la lógica de Django. Detrás de las cortinas, consultará la mesa en el medio.
Sin embargo, debe corregir el parámetro related_name=… [Django-doc] . El related_name especifica el nombre de la relación a la inversa , de Course a Profile en este caso. Por lo tanto, debería ser algo así como 'profiles' :
class Profile(AbstractUser): bio = models.TextField() image = models.ImageField(default='defaults/user/default_u_i.png', courses = models.ManyToManyField('home.Course' , related_name='profiles' ) def __str__(self): return self.username Así puedes obtener las personas que participan en un Course objeto con:
mycourse .profiles.all() y puedes acceder a los courses en los que un Profile está matriculado con:
myprofile .courses.all()Para obtener más información, consulte la sección Relaciones de muchos a muchos de la documentación .
Puede agregar un curso a los cursos de un usuario con:
@login_required def course_add(request): if request.method == 'POST': form = CourseForm(request.POST) if form.is_valid(): course = form.save() request.user .courses.add(course) else: form = CourseForm() context = { 'form': form } return render(request,'home/courses/course_add.html', context)