如何在 Django Rest 的 Model Serializer 中获取经过身份验证的用户信息?
How to get the authentificated user information in Model Serializer in Django Rest?
我有一个 LinkList 对象,它有所有者 属性 - 它所属的用户的用户名。我正在尝试将 LinkList 链接到发出创建请求的用户,但是 self.context['request'].user 和 CurrentUserDefault 在我的创建方法中不起作用,所以我无法创建 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)
我有一个 LinkList 对象,它有所有者 属性 - 它所属的用户的用户名。我正在尝试将 LinkList 链接到发出创建请求的用户,但是 self.context['request'].user 和 CurrentUserDefault 在我的创建方法中不起作用,所以我无法创建 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)