Как бороться с дефисом и Django rest ModelSerializer

Я пытаюсь реализовать конечную точку для получения электронной почты от API mailgun.com. По сути, когда электронное письмо отправляется в список рассылки, они вызывают вашу конечную точку https://host/messages/ с запросом POST.

Проблема в том, что они не используют стандартный 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'
  ],

Я пишу сериализацию и мне удается получить все поля без дефисов, такие как From, To и т. д. Но после нескольких часов испытаний мне не удается получить 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, возможно, модифицирует ключи. Кто-нибудь знает, как справиться с этой проблемой?


person Paul Fournel    schedule 23.11.2019    source источник


Ответы (1)


Я нашел обходной путь, который может помочь другим решить эту проблему. Хотя я до сих пор не понимаю, почему мой код в вопросе не работает. Если у вас есть лучший способ, я все еще ищу :)

--

Идея состоит в том, чтобы переопределить создание по POST в ViewSet и обойти 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)
person Paul Fournel    schedule 26.11.2019