[英]How to send POST data to nested Serializer Django Rest Framework?
[英]How to send mail to the post author when got new comment in django rest framework through serializer?
我正在嘗試構建一個 API,學生將在其中提問,老師將回答該問題。 對於提問和回答,我使用的是博文方式。 現在,我的問題是我正在嘗試從序列化程序發送郵件。 但是當我想檢測帖子作者時,我無法做到這一點。 我可以發送選定的用戶,但不能從 model 發送。 如果有人可以幫助我,那將非常有幫助。 非常感謝。
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)
class add_questionFileSerializer(serializers.ModelSerializer):
class Meta:
model = add_questionFile
fields = ['id', 'file', 'question']
extra_kwargs = {
'question': {'required': False},
}
class add_questionSerializer(serializers.ModelSerializer):
files = add_questionFileSerializer(many=True, required=False)
class Meta:
model = add_question
fields = ('id', 'created_by', 'title', 'description', 'files', 'is_answered')
def create(self, validated_data):
question = add_question.objects.create(**validated_data)
try:
# try to get and save images (if any)
files_data = dict((self.context['request'].FILES).lists()).get('files', None)
for file in files_data:
add_questionFile.objects.create(question=question, file=file)
except:
# if no images are available - create using default image
add_questionFile.objects.create(question=question)
send_mail(
'Question {} has been asked'.format(question.pk),
'A new question has been asked . DATA: {}'.format(validated_data),
'noreply@suflek.com',
['testuser@gmail.com', 'testuser1@gmail.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@test.com',
['testuser2@gamil.com'],
fail_silently=False,
)
return question
class submit_answerFileSerializer(serializers.ModelSerializer):
class Meta:
model = submit_answerFile
fields = ['id', 'file', 'answer']
extra_kwargs = {
'answer': {'required': False},
}
class submit_answerSerializer(serializers.ModelSerializer):
files = submit_answerFileSerializer(many=True, required=False)
class Meta:
model = submit_answer
fields = ('id', 'question_id', 'created_by', 'description', 'files')
def create(self, validated_data):
answer = submit_answer.objects.create(**validated_data)
try:
# try to get and save images (if any)
files_data = dict((self.context['request'].FILES).lists()).get('files', None)
for file in files_data:
submit_answerFile.objects.create(answer=answer, file=file)
except:
# if no images are available - create using default image
submit_answerFile.objects.create(answer=answer)
send_mail(
'Your asked question has been answered',
'Here is the message. DATA: {}'.format(validated_data),
'noreply@test.com',
['testuser@gmail.com'], # need to add the user who asked the question
fail_silently=False,
)
return answer
# 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
model 的外鍵,並且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
In the function get_user_email
you would be accesing the email of the User
the created the add_question
object that is represented by the ForeignKey=question_id
stored in the submit_answer
object
我也幾乎像上面的解決方案一樣解決了這個問題。 但想與大家分享,也供我將來使用。
我剛剛修改了序列化程序的 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,
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.