【问题标题】:Add new field and value to the request - Django - Django Rest Framework (viewset, serializer)向请求中添加新字段和值 - Django - Django Rest Framework (viewset, serializer)
【发布时间】:2021-08-07 22:15:25
【问题描述】:

我在 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
        )

示例 - 发布请求:

    {
        "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",在模型中自动生成

"user": "c6fbbfee-2f16-49f3-b4cd-b99e05a66ea8" 截取用户id请求,并保存

【问题讨论】:

  • 也许是这个,*.com/questions/35518273/…
  • 您可以在您的序列化程序中覆盖 create 方法或在您的视图集中 (APIView) 中的 post 方法。根据您希望用户成为什么。
  • @ItsMilann 这样做的最佳做法是什么?
  • 我看不出有什么区别,除了序列化程序无法直接访问请求对象,所以我建议在 apiview 中创建它
  • @ItsMilann 要创建 ApiView,我需要修改我当前的 apiview 吗?你能演示我如何在 'apiview' 和 'serializer' 中做到这一点吗?

标签: python django model-view-controller django-rest-framework


【解决方案1】:

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

【讨论】:

  • 确保用户已经登录。你能检查request.user的值吗,它显示了什么?
  • 我放置了 request.user 打印,但没有打印。
  • 我已经更新了声明,请尝试一下。
【解决方案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)

【讨论】:

    最近更新 更多