簡體   English   中英

通過序列化程序在 django rest 框架中獲得新評論時如何向帖子作者發送郵件?

[英]How to send mail to the post author when got new comment in django rest framework through serializer?

我正在嘗試構建一個 API,學生將在其中提問,老師將回答該問題。 對於提問和回答,我使用的是博文方式。 現在,我的問題是我正在嘗試從序列化程序發送郵件。 但是當我想檢測帖子作者時,我無法做到這一點。 我可以發送選定的用戶,但不能從 model 發送。 如果有人可以幫助我,那將非常有幫助。 非常感謝。

這些是 add_question model 並回答問題 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM