繁体   English   中英

如何将用户与 Django drf 中的发布请求相关联

[英]How to associate user to a post request in Django drf

我有以下几点:

我正在使用基于 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 字段中取出作者时......

对任何线索都会感到高兴....

我的代码附在下面

模型.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)

查看.py

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

序列化程序.py

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

您可以使用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']

另一种方法可以是使用

默认值设置为CurrentUserDefault HiddenField

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

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

像这样的东西:

class ExperimentsSerializers(serializers.ModelSerializer):
    author = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = models.Experiments
        fields = '__all__'

参考 :

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM