如何处理连字符和Django rest ModelSerializer

问题描述 投票:0回答:2

我正在尝试实现一个端点,以从mailgun.com API接收电子邮件。基本上,当电子邮件发送到邮件列表时,他们通过POST请求调用端点https://host/messages/

问题是,它们不使用标准REST,并且某些键包含连字符。这是我收到的请求的一个示例:

{
  'Date': [
    'Fri, 26 Apr 2013 11:50:29 -0700'
  ],
  'From': [
    'Bob <[email protected]>'
  ],
  'Sender': [
    '[email protected]'
  ],
  'Subject': [
    'Re: Sample POST request'
  ],
  'To': [
    'Alice <[email protected]>'
  ],
  'body-plain': [
    'Hi Alice,\n\nThis is Bob.\n\nI also attached a file.\n\nThanks,\nBob\n\nOn 04/26/2013 11:29 AM, Alice wrote:\n> Hi Bob,\n>\n> This is Alice. How are you doing?\n>\n> Thanks,\n> Alice\n\n'
  ],

[我编写了一个序列化文件,并设法获得没有连字符的所有字段,例如FromTo等。但是经过数小时的试验,我无法设法获得body-plain

我尝试过:

class MessageSerializer(serializers.ModelSerializer):
    Text = serializers.CharField(source='body-plain')

    class Meta:
        model = Message
        fields = ['From', 'To', 'Subject', 'Text']

但出现错误{"Text":["This field is required."]}

在我看来,Django rest可能正在修改密钥。有人知道如何处理这个问题吗?

python django django-rest-framework mailgun mailing-list
2个回答
0
投票

覆盖__init__()方法,

class MessageSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields.update({'body-plain': serializers.CharField()})

    class Meta:
        model = Message
        fields = ['From', 'To', 'Subject', 'body-plain']

0
投票

我发现可以解决此问题的其他方法。虽然,我仍然不明白为什么我的代码在问题中不起作用。如果您有更好的方法,我仍在寻找:)

-

想法是在ViewSet中覆盖POST上的创建,并绕过ModelSerializer

class MessageViewSet(viewsets.ModelViewSet):
    queryset = Message.objects.all()
    serializer_class = MessageSerializer

    def perform_create(self, serializer):
        msg = Message.objects.create(Subject=self.request.data['Subject'], To=self.request.data['To'], From=self.request.data['From'], Text=self.request.data['stripped-text'])
        msg.save()


class MessageSerializer(serializers.ModelSerializer):
    Text = serializers.CharField(source='body-plain')

    class Meta:
        model = Message
        fields = ['From', 'To', 'Subject', 'Text']
        read_only_fields = ['Text']


class Message(BaseModel):
    From = models.CharField(max_length=500)
    To = models.CharField(max_length=500)
    Subject = models.CharField(max_length=500)
    Text = models.CharField(max_length=10000)
    timestamp = models.DateTimeField(auto_now=True)
© www.soinside.com 2019 - 2024. All rights reserved.