【问题标题】:DRF serialize and save model with user FKDRF 使用用户 FK 序列化和保存模型
【发布时间】:2019-06-20 04:55:34
【问题描述】:

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,它对 User 具有 FK 依赖关系,但 User 不是 POST 有效负载的一部分。我能够弄清楚如何做到这一点的唯一方法是如上所述,将request.user.id 添加到请求数据中,然后再将其传递给序列化程序。有没有更好的方法来序列化UserContentItem并达到同样的目的?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我喜欢这种方法,但是,我收到一个错误:self.user = serializer_field.context['request'].user KeyError: 'request'。我需要将参数context 添加到def post(self, request): 吗?
    • 是的,我已经更新了答案。请看一看。仅供参考:在GenericViews 中,请求通过上下文自动传递给序列化程序。 @卡特
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      相关资源
      最近更新 更多