Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django drf中将用户与post请求关联_Python_Django_Django Models_Django Rest Framework_Django Views - Fatal编程技术网

Python 如何在Django drf中将用户与post请求关联

Python 如何在Django drf中将用户与post请求关联,python,django,django-models,django-rest-framework,django-views,Python,Django,Django Models,Django Rest Framework,Django Views,我有以下资料: 我正在使用基于JWT令牌的DRF。 我想把一个实验与一个用户联系起来,也就是说,当一个post请求到达时,我希望能够将该post请求与发送请求的用户为作者所需的Foreginkey一起保存。 POST请求始终经过身份验证且从不匿名,即request.user始终存在(我可以在调试时看到它) 我试图添加以下内容 def create(self, request, **kwargs): request.data["author"] = request.user seria

我有以下资料:

我正在使用基于JWT令牌的DRF。 我想把一个实验与一个用户联系起来,也就是说,当一个post请求到达时,我希望能够将该post请求与发送请求的用户为作者所需的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\u valid
return始终为False(ts唯一为true的时间是在我将作者从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)
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
serializer_class = ExperimentsSerializers
queryset = Experiments.objects.all()
filterset_fields = '__all__'
permission_classes = (permissions.IsAuthenticated,)
查看.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)
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__'

您只需传递带有参数的附加数据:

def create(self, request, **kwargs):
   serializer = ExperimentsSerializers(data=request.data)
   if serializer.is_valid():
       serializer.save(author=request.user)
请注意,您可能需要指定
作者
字段,以便在请求正文中不需要该字段:

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

还有一种方法可以使用

HiddenField
,默认值设置为
CurrentUserDefault

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

author=serializers.HiddenField(默认值=serializers.CurrentUserDefault())

大概是这样的:

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

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

  • 希登菲尔德-
  • CurrentUserDefault-

关于如何处理用户关联问题,您是否有一个很好的链接?例如,当用户发出get请求时,他只能获取他的数据、删除put等。@helper您可以重写视图类的
get\u queryset
方法。检查以下示例: