> Как конкретизировать промежуточную таблицу many-to-many в Django для добавления дополнительных полей (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Стилсофт

Стек: Python

> Пример ответа

В Django для добавления дополнительных полей в промежуточную таблицу many-to-many нужно отказаться от автоматической модели through и создать свою. Используйте аргумент through в ManyToManyField.

Пример:

PYTHON
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
class Course(models.Model):
title = models.CharField(max_length=100)
students = models.ManyToManyField(Student, through='Enrollment')
class Enrollment(models.Model): # Промежуточная модель
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
date_enrolled = models.DateField(auto_now_add=True) # Дополнительное поле
grade = models.CharField(max_length=2, blank=True) # Ещё одно поле
class Meta:
unique_together = ('student', 'course') # Гарантируем уникальность пары

Ключевые моменты:

  • Укажите through='Enrollment' в ManyToManyField.
  • В промежуточной модели обязательно определите два внешних ключа на связанные модели.
  • Добавьте любые дополнительные поля (даты, статусы, оценки и т.д.).
  • Для создания связи используйте Enrollment.objects.create(student=..., course=..., grade='A'), а не course.students.add(student).
  • Можно добавить unique_together или constraints для предотвращения дублирования связей.

Такой подход даёт полный контроль над данными в связующей таблице.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью