Вы можете прослушать сигнал Post Save , излучаемый при сохранении этих моделей, и выполнить необходимое создание в обработчике. Этот сигнал вызывает обработчик с аргументом created
, равным True
, если была создана новая запись.
Обратитесь к документации по сигналам , чтобы узнать, как зарегистрировать ваши обработчики.
Образец выглядит следующим образом
from django.db.models.signals import post_delete, post_save
from .models import Student, Question, StudentAndQuestion
def add_question_to_students(sender, instance, created, *args, **kwargs):
question = instance
if created:
StudentAndQuestion.objects.bulk_create([
StudentAndQuestion(question=question, student_id=student_id)
for student_id in Student.objects.values_list("id", flat=True)
])
def add_student_to_question(sender, instance, created, *args, **kwargs):
student = instance
if created:
StudentAndQuestion.objects.bulk_create([
StudentAndQuestion(question=question_id, student=student)
for question_id in Question.objects.values_list("id", flat=True)
])
post_save.connect(add_question_to_students, sender=Question)
post_save.connect(add_student_to_question, sender=Student)
Кроме того, вы можете переопределить сохранение в обеих моделях, чтобы сделать то же самое
class Question(models.Model):
....
def save(*args, **kwargs):
is_create = self.pk is None
instance = super().save(*args, **kwargs)
add_question_to_students(Question, self, is_created)
class Student(models.Model):
....
def save(*args, **kwargs):
is_create = self.pk is None
instance = super().save(*args, **kwargs)
add_student_to_question(Student, self, is_created)
Я чувствую, что позже это будет понятнее, так как легче будет выяснить, что все происходит при сохранении, но это может привести к круговым зависимостям, если модели находятся в разных приложениях.