Как отправить письмо автору поста при получении нового комментария в django rest framework через сериализатор?

Я пытаюсь создать API, в котором ученики будут задавать вопросы, а учитель будет отвечать на них. Для задавания вопросов и ответов я использую способ записи в блоге. Проблема в том, что я пытаюсь отправить почту из сериализатора. Но когда я хочу определить автора сообщения, я не могу этого сделать. Я могу отправить выбранным пользователям, но не из модели. Если кто-нибудь может помочь мне с этим, это будет очень полезно. Большое спасибо.

это модель add_question и модель answer the question ---

    class add_question(models.Model):
    title = models.CharField(max_length=250, blank=False)
    description = models.TextField(blank=True, null=True)
    is_answered = models.BooleanField(default=False)
    is_deleted = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, blank=False, on_delete=models.CASCADE)
    STATUS = (
        ('Published', 'Published'),
        ('Suspended', 'Suspended'),
        ('Unpublished', 'Unpublished'),
    )
    status = models.CharField(choices=STATUS, default='Published', max_length=100)
    RESOLUTION = (
        ('Resolved', 'Resolved'),
        ('Unresolved', 'Unresolved'),
    )
    resolution = models.CharField(choices=RESOLUTION, default='Published', max_length=100)

    def __str__(self):
        return self.title


class add_questionFile(models.Model):
    question = models.ForeignKey(add_question, on_delete=models.CASCADE, related_name='files')
    file = models.FileField('files', upload_to=path_and_rename, max_length=500, null=True, blank=True)




class submit_answer(models.Model):
    description = models.TextField(blank=False, null=False)
    is_deleted = models.BooleanField(default=False)
    rating = models.FloatField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    question_id = models.ForeignKey(add_question, blank=False, on_delete=models.CASCADE)
    created_by = models.ForeignKey(User, blank=False, on_delete=models.CASCADE)

class submit_answerFile(models.Model):
    answer = models.ForeignKey(submit_answer, on_delete=models.CASCADE, related_name='files')
    file = models.FileField('files', upload_to=path_and_rename, max_length=500, null=True, blank=True)

это сериализатор

это мнения

    # ask question POST and GET API
class add_questionAPIView(generics.ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = add_question.objects.all()
    serializer_class = add_questionSerializer
    
    #single question GET API
class all_questionsDetailsAPIView(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = add_question.objects.all()
    serializer_class = add_questionSerializer

# comment POST and GET API
class submitanswerAPIView(generics.ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = submit_answer.objects.all()
    serializer_class = submit_answerSerializer

    #single comment GET API
class submitanswerDetailsAPIView(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = submit_answer.objects.all()
    serializer_class = submit_answerSerializer

Если требуется какая-либо другая информация, пожалуйста, дайте мне знать. Я не такой эксперт, все делают на основе изучения. Еще раз спасибо заранее.

Поскольку question_id является внешним ключом, связанным с моделью add_question и add_question имеет поле created_by, вы можете использовать serializerModelField для добавления другого поля в сериализатор, примерно так:

user_email = serializers.SerializerMethodField('get_user_email')

class Meta:
    model = submit_answer
    fields = ('id', 'question_id', 'created_by', 'description', 'files', 'user_email')

def get_user_email(self, obj):
    return obj.question_id.created_by.email

В функции get_user_email вы будете получать доступ к электронной почте User, создавшей объект add_question, который представлен ForeignKey=question_id, хранящейся в объекте submit_answer

Я также решил проблему почти так же, как решение выше. Но решил поделиться с вами и для моего будущего использования.

Я просто модифицировал часть send_mail() to_email сериализатора и вызвал ее через внешний ключ.

в add_question я использую два письма в одном действии, а в submit_answer - одно. Спасибо, надеюсь, что это сработает и поможет вам.

#add_questionFileSerializer

    send_mail(
                'Question {} has been asked'.format(question.pk),
                'A new question has been asked . DATA: {}'.format(validated_data),
                'noreply@email.com',
                ['email1@email.com', 'email2@email.com'],
                fail_silently=False,
            )
            send_mail(
                'Your question has been submitted'.format(question.pk),
                'Your asked question has been submitted to SUFLEK. We will reach with solution soon. DATA: {}'.format(validated_data),
                'noreply@email.com',
                # [to_email],
                ['{}'.format(question.created_by)],
                fail_silently=False,
            )


#submit_answerSerializer
    send_mail(
            # subject
            'Your asked question has been answered',
            # body
            'Here is the message. DATA: {}'.format(validated_data),
            # from mail
            'noreply@email.com',
            # to mail
            ['{}'.format(answer.question_id.created_by)], //this line I got my solution
            fail_silently=False,
        )
Вернуться на верх