Как отправить письмо автору поста при получении нового комментария в 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,
)