DRF与用户FK序列化并保存模型

时间:2019-01-26 17:24:03

标签: django python-3.x django-rest-framework python-3.5

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。我想允许经过身份验证的用户发布对UserContentItem具有FK依赖关系的新User,但是User不是POST负载的一部分。我能够弄清楚如何做到这一点的唯一方法是如上所述,将request.user.id添加到请求数据中,然后再传递给序列化程序。是否有更好的方法来序列化UserContentItem并实现相同的目标?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用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。

答案 1 :(得分:0)

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

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