Python 如何在Django drf中将用户与post请求关联
我有以下资料: 我正在使用基于JWT令牌的DRF。 我想把一个实验与一个用户联系起来,也就是说,当一个post请求到达时,我希望能够将该post请求与发送请求的用户为作者所需的Foreginkey一起保存。 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
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\u queryset
方法。检查以下示例: