简体   繁体   English

如何在 Django Rest Framework 中通过电子邮件发送动态数据

[英]How to send dynamic data in email in Django Rest Framework

I am trying to write a function that sends a notification email after a file has been uploaded.我正在尝试编写一个在文件上传后发送通知电子邮件的函数。 My below code works if I hard-code the "send-to" email address.如果我对“发送到”电子邮件地址进行硬编码,则我的以下代码有效。

def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
        from_email = self.request.user.email
        send_mail('New Files have been Uploaded',
                  'New files have been uploaded.',
                  from_email,
                  ['sendto@email.com', ],
                  fail_silently=False)

I need to set the "sendto@email.com" dynamically based on the editor_email that is in the serializer.我需要根据序列化程序中的 editor_email 动态设置“sendto@email.com”。 Below is the serializer.下面是序列化器。

class VideoSerializer(serializers.ModelSerializer):
    projectName = serializers.SerializerMethodField(allow_null=True)
    editor_email = serializers.EmailField(
        source='editor.email', required=False)

    class Meta:
        model = Video
        # fields = '__all__'
        fields = [
            'url',
            'handle',
            'filename',
            'size',
            'source',
            'uploadId',
            'originalPath',
            'owner',
            'project',
            'uploadDate',
            'editor',
            'projectName',
            'editor_email'
        ]

    def get_projectName(self, obj):
        return obj.project.projectName

When I check the JSON response in the front end of the app, the value for "editor_email" is what I expect it to be.当我在应用程序的前端检查 JSON 响应时,“editor_email”的值正是我所期望的。

I am relatively new to Django Rest Framework and there must be something I am missing here.我对 Django Rest Framework 比较陌生,这里一定有我遗漏的东西。 I have spent hours reading through the documentation and trying different things but nothing seems to work.我花了几个小时阅读文档并尝试不同的东西,但似乎没有任何效果。

Please, can someone tell me how to set this email based on the serializer?请问,有人可以告诉我如何根据序列化程序设置此电子邮件吗?

Remove the mail send code snippet from views.py and move it into serilizers asviews.py删除邮件发送代码片段并将其移动到serilizers

# views.py
def perform_create(self, serializer):
    serializer.save(owner=self.request.user)
     
   
     from_email = self.request.user.email send_mail('New Files have been Uploaded', 'New files have been uploaded.', from_email, ['sendto@email.com', ], fail_silently=False) 
   


# serializers.py
class VideoSerializer(serializers.ModelSerializer):
    # your code


    def send_dynamic_mail(self, video_instance): from_email = video_instance.owner.email send_mail('New Files have been Uploaded', 'New files have been uploaded.', from_email, [video_instance.editor.email, ], fail_silently=False) def create(self, validated_data): video_instance = super().create(validated_data) self.send_dynamic_mail(video_instance) return video_instance

I think you could get the field editor_email data in your function.我认为您可以在您的函数中获取字段editor_email数据。 If it only string data, then you could do it like this:如果它只是字符串数据,那么你可以这样做:

def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
        to_email = serializer.data['editor_email']

        if to_email:
            from_email = self.request.user.email
            send_mail('New Files have been Uploaded',
                      'New files have been uploaded.',
                      from_email,
                      [to_email, ],
                      fail_silently=False)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM