向请求Django Django Rest框架(viewset,序列化程序)添加新字段和值

2024-10-02 14:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django rest框架中有一个端点,并收到一个对象namedate

在保存数据库之前,我需要在对象中包含用户(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
        )

示例-发布请求:

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

示例-回复后:

    {
        "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


Tags: 对象nameidfalsetruedatemodelmodels
2条回答

我设法用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)

如果要使用所有这些混音,最好使用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)

相关问题 更多 >