向请求添加新字段和值 - Django - Django Rest Framework (viewset, serializer)

Add new field and value to the request - Django - Django Rest Framework (viewset, serializer)

我在 django-rest-framework 中有一个端点并接收一个对象 namedate.

在保存我的数据库之前,我需要在对象中包含 user (fk_model_user),如何在正文请求中保存或更新包含新项目?

    class MusicStylesViewSet(
        mixins.ListModelMixin,
        mixins.CreateModelMixin,
        mixins.UpdateModelMixin,
        mixins.DestroyModelMixin,
        mixins.RetrieveModelMixin,
        viewsets.GenericViewSet
    ):
        permission_classes = [permissions.AllowAny]
        queryset = MusicStyleModel.objects.all()
        serializer_class = StyleSerializer
    class StyleSerializer(ModelSerializer):
        class Meta:
            model = MusicStyleModel
            fields = ('id', 'name', 'date', 'user')
    class MusicStyleModel(models.Model):
        id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False, null=False)
        name = models.CharField(max_length=150, null=False, blank=False)
        date = models.DateTimeField(null=False, blank=False)
        user = models.ForeignKey(
            CustomUser,
            null=True,
            blank=False,
            on_delete=models.CASCADE
        )

示例 - Post 请求:

    {
        "name": "test",
        "date": "2021-05-14T15:47:06.794639-03:00"
    }

示例 - Post 响应:

    {
        "id": "810ae929-2f6d-411a-8d10-77c8f613a8ac",
        "name": "test",
        "date": "2021-05-14T15:47:06.794639-03:00",
        "user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8"
    }

"id": "810ae929-2f6d-411a-8d10-77c8f613a8ac", automatically generated in the model

"user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8" user id request intercepted, and save

如果您要使用所有这些混入,最好使用 ModelViewSet'

from rest_framework import viewsets

class MusicStylesViewSet(
    mixins.ListModelMixin,
    mixins.CreateModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet
):
    permission_classes = [permissions.AllowAny]
    queryset = MusicStyleModel.objects.all()
    serializer_class = StyleSerializer
    def post(self, request, *args, **kwargs):
        serializer = StyleSerializer(request.data)
        if serializer.is_valid():
            serializer.validated_data['user'] = request.user
            serializer.save()
        return self.create(request, *args, **kwargs)

我设法使用 create 解决了问题:

from rest_framework import viewsets, status
from rest_framework.response import Response

class MusicStylesViewSet(
    mixins.ListModelMixin,
    mixins.CreateModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet
):
    permission_classes = [permissions.AllowAny]
    queryset = MusicStyleModel.objects.all()
    serializer_class = StyleSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        data = serializer.validated_data
        data['user'] = request.user

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)