DRF 使用用户 FK 序列化和保存模型

DRF serialize and save model with user FK

models.py

class UserContentItem(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    created_date = models.DateTimeField(default=timezone.now)

views.py

class UserContentItemView(APIView):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, )

    def post(self, request, format=None):
        data = request.data
        data['owner'] = request.user.id
        serializer = UserContentItemSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class UserContentItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserContentItem
        fields = ('id', 'owner', 'title', 'created_date')

我正在使用 Django Rest Framework 和简单的 jwt 构建一个 API。我想允许经过身份验证的用户 POST 一个新的 UserContentItem,它对 User 具有 FK 依赖性,但 User 不是 POST 负载的一部分。我能够弄清楚如何执行此操作的唯一方法是如上所述,在将请求数据传递给序列化程序之前将 request.user.id 添加到请求数据中。有没有更好的方法来序列化 UserContentItem 并实现相同的目标?

我想你可以这样尝试 CurrentUserDefault:

class UserContentItemSerializer(serializers.ModelSerializer):

    owner = serializers.PrimaryKeyRelatedField(
        read_only=True, 
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = UserContentItem
        fields = ('id', 'owner', 'title', 'created_date')

并且在视图中,将请求作为上下文传递给序列化程序:

serializer = UserContentItemSerializer(data=data,context={'request':request})

此外,您不需要使用 data 传递用户 ID。

你的方法很好,即使你可以遵循这些

serializer.save(owner=self.request.user)