Как получить информацию об аутентифицированном пользователе в сериализаторе моделей в Django Rest?
У меня есть объект LinkList, который имеет свойство owner - имя пользователя, которому он принадлежит. Я пытаюсь сделать так, чтобы LinkLists были связаны с пользователем, который сделал запрос на создание, однако self.context['request'].user и CurrentUserDefault не работают в моем методе create, поэтому я не могу создать экземпляр объекта 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. Необходимо, чтобы возвращалось поле owner
Если да, просто передайте пользователя вручную в метод сериализатора save() в методе представления perform_create() (я предполагаю, что вы используете generic view):
serializer.save(owner=self.request.user)