讨论之后,我会提出以下建议。
from django.conf import settings
from django.core.mail import send_mail
from django.db import models
from rest_framework import serializers, viewsets, routers, mixins
from rest_framework.response import Response
class Message(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL)
recipient = models.EmailField()
class MessageSerializer(serializers.ModelSerializer):
message = serializers.CharField(write_only=True)
class Meta:
model = Message
fields = ['recipient', 'message']
def create(self, validated_data):
message = validated_data.pop('message')
message_obj = super().create(validated_data)
send_mail(
'Invitation',
message,
'exampleemail@gmail.com',
[message_obj.recipient]
)
return message_obj
class SendInviteView(mixins.CreateModelMixin, viewsets.GenericViewSet):
serializer_class = MessageSerializer
def perform_create(self, serializer):
serializer.save(sender=self.request.user)
router = routers.DefaultRouter()
router.register('send_invite', SendInviteView, base_name='send_invite')
urlpatterns = router.urls
我们分手吧。
如果要存储发件人,则需要
ForeignKey
到
User
在你的模型里。
对于序列化程序,需要添加
message
字段手动,因为它不存在于您的模型中,但是用户应该提交它。我们将其设置为只写,因为此序列化程序还将用于序列化创建的
Message
返回用户进行响应,并且
消息
没有
消息
字段。此序列化程序还将为
recipient
自动从
消息
模型。
然后我们重写
create
在这个序列化程序中,所以每当
消息
将使用它创建,它将发送电子邮件。它叫
super().create(..)
真正的拯救
消息
发送到数据库,然后发送电子邮件。我们用
.pop()
删除
消息
从
validated_data
,因为
消息
不包含此类字段。
我们不需要所有的东西
ModelViewSet
提供。它增加了创建、读取、更新和删除的能力(
CRUD
)你的
消息
,实际上并不需要。你只需要简单的创建
POST
在http请求方面。
GenericViewSet
具有
CreateModelMixin
正是我们想要的
模型视图集
只要有更多的混合物。来自用户的数据将由序列化程序验证,并且
perform_create
方法将被调用。我们路过
sender=self.request.user
到
serializer.save()
因为我们需要拯救
sender
进入之内
消息
,和
发件人
字段实际上不在数据中,它是当前登录的用户。
序列化程序.save()
将运行我们的
MessageSerializer.create()
所以我们很高兴。
注意,这些东西只对登录的用户有效,因为我们需要以某种方式填充
发件人
数据库中的字段,因此添加
class SendInviteView(mixins.CreateModelMixin, viewsets.GenericViewSet):
permission_classes = [IsAuthenticated]
....
所以只有经过身份验证的用户才能发出请求。
希望这能为你澄清一些事情。致以最良好的问候)