Пытаюсь сделать сигнал 'friend request' в django, но получаю ошибку ограничения FOREIGN KEY - Django
Я пытаюсь сделать функцию, в которой ученик может послать запрос на дружбу учителю, и если учитель принимает его, то ученик должен быть добавлен в список учеников, присутствующий в модели профиля учителя, а учитель должен быть добавлен в список учителей, присутствующий в профиле ученика. Для обработки и хранения этих отношений между отправителем и получателем я создал другую модель (Relationship) и сигнал. Но во время выполнения операции по сигналу я получаю ошибку
FOREIGN KEY constraint failed
Пожалуйста, посмотрите мой код ниже и поправьте меня, что я должен сделать, чтобы избавиться от этой ошибки.
модель профиля учителя (TeacherDetail)
class TeacherDetail(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, null=True, blank=True)
student = models.ManyToManyField(CustomUser, blank=True, related_name='students') # this is the student's list
профиль студента (StudentDetail)
class StudentDetail(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, null=True, blank=True)
teacher = models.ManyToManyField(CustomUser, blank=True, related_name='teachers') # this is the teacher's list
модель, хранящая отправителя и получателя (Relationship)
STATUS_CHOICES=(
('sent', 'sent'),
('pending', 'pending'),
('accepted', 'accepted')
)
class Relationship(models.Model):
id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
sender = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='sender') # the student
receiver = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name='reciever') # the teacher
status = models.CharField(max_length= 10, choices=STATUS_CHOICES)
created_on = models.DateTimeField(auto_now_add=True, editable=False)
updated_on = models.DateTimeField(auto_now=True, editable=False)
сигналы
@receiver(post_save, sender=Relationship)
def handle_student_to_teacher_req(sender, instance, created, **kwargs):
student_sender = instance.sender
teacher_receiver = instance.receiver
if instance.status == 'accepted':
print(f"student_sender {student_sender}")
print(f"teacher_receiver {teacher_receiver}")
student_sender.teachers.add(teacher_receiver.id)
teacher_receiver.students.add(student_sender.id)
student_sender.save()
teacher_receiver.save()
Я впервые использую сигналы, поэтому прошу помочь исправить код выше
Я допустил ошибку при назначении моделей в модели отношений. После того, как я сделал следующее изменение, ошибка была исправлена.
class Relationship(models.Model):
id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
sender = models.ForeignKey(StudentDetail, on_delete=models.CASCADE, related_name='sender') # the student
receiver = models.OneToOneField(TeacherDetail, on_delete=models.CASCADE, related_name='reciever') # the teacher
status = models.CharField(max_length= 10, choices=STATUS_CHOICES)
created_on = models.DateTimeField(auto_now_add=True, editable=False)
updated_on = models.DateTimeField(auto_now=True, editable=False)