簡體   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