在通过ModelSerializer和DRF创建对象之前,在外键字段中将经过身份验证的用户设置为值

时间:2018-08-14 16:34:30

标签: django django-rest-framework

我正在尝试实现一个简单的终结点,以使用Django rest框架的ModelSerializer创建对象。我的模型具有用户模型的外键,我需要在端点发布功能中设置此值。

使用Django中的表单,您可以在帖子中的save方法中添加commit=false,设置属性(instance.user = self.request.user),然后使用 save()方法。但是,我找不到使用Djago Rest Framework serlializaer的清晰明了的方法。

这是我的模特。

class Ticket(models.Model):
    images_quantity = models.PositiveSmallIntegerField()

    status = models.PositiveSmallIntegerField(
        choices=TICKET_STATUS_CHOICES,
        default=PENDING_TICKET,
    )

    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

    created_at = models.DateTimeField(
        auto_now_add=True,
    )

因此,如您所见,User模型有一个外键。在我的发布端点中,必须使用经过身份验证的用户来填充此值。

看看序列化器:

class TicketSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ticket
        fields = ('images_quantity',)

用户仅必须发送images_quantity字段值。因此,我需要创建一个票证模型的新实例,并将经过身份验证的用户ID设置为created_by字段中的值。

这是我的观点:

class TicketFormView(APIView):
    def post(self, request, format=None):
        serializer = TicketSerializer(data=request.data)
        if serializer.is_valid():
            # Here is my problem. I need to set the created_by field before save.
            serializer.save()

            return Response(
                serializer.data,
                status=status.HTTP_200_OK,
            )

        return Response(
            serializer.errors,
            status=status.HTTP_400_BAD_REQUEST,
        )

如果我发送帖子,则会收到"null value in column "created_by_id" violates not-null constraint"错误,这是因为我需要在此字段中设置经过身份验证的用户ID。我该怎么办?

2 个答案:

答案 0 :(得分:2)

将created_by添加到序列化器的字段列表中,然后您可以轻松地将已认证的用户传递给序列化器的save方法:

serializer.save(created_by=request.user)

但是我建议您利用rest框架的泛型并执行以下操作:

from rest_framework import generics, serializers
from rest_framework.permissions import IsAuthenticated

class TicketFormView(generics.CreateAPIView):
    serializer_class = TicketSerializer
    queryset = Ticket.objects.all()
    permission_classes = ( IsAuthenticated, )

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)

通过这种方式,您不必自己实现任何post方法,因为这是您完成操作的非常标准的方法。

答案 1 :(得分:1)

用户 PrimaryKeyRelatedField CurrentUserDefault

class TicketSerializer(serializers.ModelSerializer):
    created_by = serializers.PrimaryKeyRelatedField(
        queryset=User.objects.all(),
        default=serializers.CurrentUserDefault()

    )

    class Meta:
        model = Album
        fields = ('images_quantity', 'created_by')

这里User.objects.all()应该是您的settings.AUTH_USER_MODEL的{​​{1}}

参考
 1. CurrentUserDefault
2. PrimaryKeyRelatedField