如何在 Django Rest 的 Model Serializer 中获取经过身份验证的用户信息?

How to get the authentificated user information in Model Serializer in Django Rest?

我有一个 LinkList 对象,它有所有者 属性 - 它所属的用户的用户名。我正在尝试将 LinkList 链接到发出创建请求的用户,但是 self.context['request'].userCurrentUserDefault 在我的创建方法中不起作用,所以我无法创建 LinkList 对象的实例。

我得到的错误:

NOT NULL constraint failed: llists_linklist.owner_id

这是序列化器:

class LinkListSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="lists-detail")
    owner = serializers.ReadOnlyField(source='owner.username')
    links = LinkSerializer(many=True)

    class Meta:
        model = LinkList
        fields = ['url', 'owner', 'name', 'public', 'links']

    def create(self, validated_data):
        links = validated_data.pop('links', [])
        instance = super().create(validated_data)
        for item in links:
            instance.links.add(link=item)
        return instance

模型:

class LinkList(models.Model):
    owner = models.ForeignKey(
        User,
        related_name='lists',
        on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=250)
    public = models.BooleanField(default=False)
    links = models.ManyToManyField(
        Link,
        related_name='linklists')

    def __str__(self):
        return "%s - %s" % (self.owner, self.name)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

问题是,owner 字段实际上是一个必填字段,您没有通过序列化程序传递它,因为您在序列化程序中将 owner 字段设为只读。

看起来你有两个选择:

1.您不需要返回所有者字段

如果是这样,只需使用 HiddenField()CurrentUserDefault():

owner = serializers.HiddenField(default=serializers.CurrentUserDefault())

2。您需要返回所有者字段

如果是这样,只需将用户手动传递给视图的 perform_create() 方法中的序列化程序的 save() 方法(我假设您使用的是通用视图):

serializer.save(owner=self.request.user)