ManyToMany Отношения между двумя моделями в Django - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь создать веб-сайт, чтобы пользователи могли добавлять курсы, которые они посещают. Я хочу знать, как мне добавить отношения ManyToMany. Таким образом, мы можем получить всех пользователей в курсе на основе кода курса или инструктора или любого поля. И мы также можем получить курсы, в которые зарегистрирован пользователь. В настоящее время моя структура базы данных:

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_code

и моя модель пользователя:

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.username

Мне было интересно, должны ли быть отношения ManyToMany в Пользовательская модель или модель курса? Или это вообще что-то изменит?

РЕДАКТИРОВАТЬ : для добавления курса к объекту публикации сейчас я использую это представление, но, похоже, оно не работает:

@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)

1 Ответ

2 голосов
/ 03 мая 2020

Для реляционных баз данных модель, в которой вы определяете ManyToManyField, не имеет значения. Django создаст дополнительную таблицу с двумя ForeignKey s для двух моделей, которые связаны ManyToManyField.

Связанными менеджерами, которые будут добавлены, et c. это все Django лог c. За занавесками будет выполнен запрос к таблице посередине.

Однако вам необходимо исправить параметр related_name=… [Django -doc] . related_name указывает имя отношения в reverse , поэтому в данном случае от Course до Profile. Таким образом, это должно быть что-то вроде 'profiles':

class Profile(AbstractUser):
    bio = models.TextField()
    image = models.ImageField(default='defaults/user/default_u_i.png', 
    courses = models.ManyToManyField('home.Course'<b>, related_name='profiles'</b>)

    def __str__(self):
        return self.username

Таким образом, вы можете получить людей, которые участвуют в Course объекте с помощью:

mycourse<b>.profiles.all()</b>

, и вы можете получить доступ к courses, в котором Profile зарегистрировано с:

myprofile<b>.courses.all()</b>

Для получения дополнительной информации см. отношение «многие ко многим» в документации .

Вы можете добавить курс к курсам пользователя с помощью:

@login_required
def course_add(request):
    if request.method == 'POST':
        form = CourseForm(request.POST)
        if form.is_valid():
            course = form.save()
            request.user<b>.courses.add(course)</b>
    else:
        form = CourseForm()
    context = {
        'form': form
    }
    return render(request,'home/courses/course_add.html', context)
...