maximkv25
@maximkv25
web-developer

Как добавить field в serialization?

Использую DRF
В модели нет поля, которое нужно для работы api, нужно добавить токен в запрос.

models.py
from django.db import models
from accounts.models import User


class Post(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    like = models.BigIntegerField(default=0)
    text = models.TextField(max_length=1000, blank=True, default='')


serializers.py
from django.contrib.auth import get_user_model
from post.models import Post, User
from rest_framework.serializers import (
    CharField,
    ModelSerializer,
    SerializerMethodField,
    ValidationError
)


class PostCreationSerializer(ModelSerializer):
    token = SerializerMethodField()
    text = CharField(required=False, allow_blank=True)

    def get_token(self, obj):
        pass

    class Meta:
        model = Post
        fields = (
            'text',
            'token'
        )

    def validate(self, data):
        text = data['text']
        user = User.objects.get(id=1)
        post = Post.objects.create(owner=user, text=text)
        return data


views.py
class PostCreationAPIView(APIView):
    permission_classes = [AllowAny]
    serializer_class = PostCreationSerializer
    # queryset = Post.object.all()

    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = PostCreationSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data, status=HTTP_200_OK)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)


SerializerMethodField() только для чтения, мне нужно добавить поле token, чтобы добавлять в запрос и ввести ограничения на создание модели, если токен не валидный. Как это можно реализовать?
  • Вопрос задан
  • 634 просмотра
Решения вопроса 1
Не советую так поступать. И совет Сергея это антипаттерн. Токены в запросах принято отправлять в заголовке http запроса, а не в теле.
Стандарт: https://www.w3.org/Protocols/rfc2616/rfc2616-sec14...

Найдите соответствующий middleware для Django в соответствии с Вашим видом токена, который значительно упростит Вашу жизнь. Для экзотики можно написать и свой middleware
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Вообще когда в API говорят про токен, это обычно касается аутентификации. В этом случае поле в сериалайзер добавлять не надо.
Если же хочется прям наряду с остальными полями токен передавать, то придется делать кастомное поле и навешивать на него валидацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы