【问题标题】:How to associate user to a post request in Django drf如何将用户与 Django drf 中的发布请求相关联
【发布时间】:2020-05-21 07:40:26
【问题描述】:

我有以下:

我正在使用基于 DRF 的 JWT 令牌。 我想将一个实验与一个用户相关联,即当一个帖子请求到达时,我希望能够将该帖子请求与发送请求的用户所需的作者所需的 Foreginkey 一起保存。 POST 请求始终经过身份验证,从不匿名,即request.user 始终存在(调试时可以看到)

我尝试添加以下内容

def create(self, request, **kwargs):
   request.data["author"] = request.user
   serializer = ExperimentsSerializers(data=request.data)
   if serializer.is_valid():
       serializer.save()
       return....

is_valid 总是返回 False (唯一一次 ts 为真,是我从 ExperimentsSerializers 字段中取出作者时......

会为任何潜在客户感到高兴....

我的代码附在下面

Model.py

class User(AbstractUser):
    pass

    def __str__(self):
        return self.username

class Experiments(models.Model):
    name = models.CharField(max_length=40)
    time = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

View.py

filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
serializer_class = ExperimentsSerializers
queryset = Experiments.objects.all()
filterset_fields = '__all__'
permission_classes = (permissions.IsAuthenticated,)

serializers.py

class ExperimentsSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Experiments
        fields = '__all__'

【问题讨论】:

    标签: python django django-models django-rest-framework django-views


    【解决方案1】:

    还有一种方法可以使用

    HiddenField,默认值设置为CurrentUserDefault

    这样,该字段不会在当前用户可访问的同时公开,并且可以对该用户上下文执行其他操作。

    作者 = serializers.HiddenField(default=serializers.CurrentUserDefault())

    类似这样的:

    class ExperimentsSerializers(serializers.ModelSerializer):
        author = serializers.HiddenField(default=serializers.CurrentUserDefault())
    
        class Meta:
            model = models.Experiments
            fields = '__all__'
    

    参考:

    【讨论】:

      【解决方案2】:

      您可以使用save 参数传递其他数据:

      def create(self, request, **kwargs):
         serializer = ExperimentsSerializers(data=request.data)
         if serializer.is_valid():
             serializer.save(author=request.user)
      

      请注意,您可能需要将 author 字段指定为 read_only,因此请求正文中不需要:

      class ExperimentsSerializers(serializers.ModelSerializer):
          class Meta:
              model = models.Experiments
              fields = '__all__'
              read_only_fields = ['author']
      

      【讨论】:

      • 您是否有关于如何处理用户关联问题的好链接?即当用户提出获取请求时,他只能获取他的数据,删除放置等等..
      • @helpper 你可以覆盖视图类的get_queryset 方法。在此处查看示例:stackoverflow.com/questions/33809345/…
      猜你喜欢
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2020-01-04
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多