Как получить информацию об аутентифицированном пользователе в сериализаторе моделей в 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)

Вернуться на верх