【问题标题】:How can I force the user id as value when working with django rest framework?使用 django rest 框架时,如何强制用户 id 作为值?
【发布时间】:2015-03-16 02:10:19
【问题描述】:

我希望我的 rest api 能够添加对象,但有一个转折。

我的模型有一个名为 user 的字段,对于匿名用户可以是 None,也可以是设置它的人的 id。

如何以优雅的方式执行此操作?

另外,如果user 字段为无,我希望将新对象的 id 存储在匿名用户会话中的数组中,以便在他决定注册时对其进行分配。

这是我创建视图集的方式:

class PointAPIView(viewsets.ModelViewSet):
    queryset = Point.objects.all()
    serializer_class = PointSerializer
    permission_classes = (IsOwnerOrReadOnly,)

我怀疑我必须编写自定义创建方法,对吗?如果是这样,它需要看起来像什么?文档只说它在那里,但没有说它需要如何构建以及它需要返回什么。你能告诉我一个我可以放置逻辑的虚拟方法的例子吗?

感谢您的宝贵时间!

编辑:因为有人问。模型看起来像这样:

class Point(models.Model):
  user = models.ForeignKey('auth.User')
  value = models.IntegerField()

现在的问题是如何在通过 rest api 创建点对象时强制 user 字段为 request.user。

【问题讨论】:

  • 您可以在问题中包含您的模型吗?现在,如果没有更多的背景资料,很难回答。
  • 对不起,如果问题不是 100% 清楚。我添加了一个简短的模型示例。现在有了带有用户字段的模型。当通过其余 api 完成创建时,我希望此字段为 request.user。

标签: django django-rest-framework django-1.7


【解决方案1】:

在您的 PointSerializer 覆盖 create 方法并获取请求对象以提取当前用户并将其分配给创建点。

class PointSerializer(serializers.ModelSerializer):
     //point fields

    class Meta:
          model = Point
          fields = ('value','user')

    def create(self,validated_data):
        request = request = self.context['request']
        user = request.user
        point = Point.objects.create(value=validated_data['value'])
        point.user = user
        point.save()
        return point

【讨论】:

    【解决方案2】:

    不确定你是否可以点名validated_data,如果不能,你需要复制它

    def create(self, validated_data):
        request = self.context['request']
        user = request.user
    
        if user.is_authenticated():
            validated_data.update({
                'user': user.id
            })
    
        point = Point.objects.create(**validated_data)
    
        return point
    

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2022-01-19
      • 2014-05-26
      • 2019-03-05
      相关资源
      最近更新 更多