Фильтр DRF PrimaryKeyField на основе текущего пользователя - PullRequest
0 голосов
/ 19 марта 2020

У меня есть представление, настроенное на возврат списка книг пользователю, который извлекается из простой модели книги на основе текущего пользователя, вошедшего в систему. Однако у меня также есть модель ReadingSession, которая имеет отношение внешнего ключа и к Книге, и к Пользователю.

Когда я получаю книги для пользователя, я бы хотел, по крайней мере, вернуть список первичных ключей, которые я могу использовать для получения длины в моем клиенте.

Следующий код получит полный набор сеансов чтения в моем BookSerializer:

from rest_framework import serializers
from books.models import Book


class BookSerializer(serializers.ModelSerializer):
    readingsession_set = serializers.PrimaryKeyRelatedField(
        many=True, read_only=True)

    class Meta:
        model = Book
        fields = ["id", "title", "author", "publisher",
                  "publish_date", "description", "category",
                  "language", "small_thumbnail", "thumbnail",
                  "readingsession_set"]

Однако, проблема в том, что он будет возвращать все чтения, независимо от того, принадлежит ли сеанс этому пользователю.

Я хотел бы иметь возможность отфильтровать это так, чтобы он возвращал только чтения чтения для текущего пользователя. Что-то в этом роде:

readingsession_set = serializers.PrimaryKeyRelatedField(queryset=ReadingSession.objects.filter(user=user), read_only=True)

Но я пробовал разные способы передачи пользователя (self.request.user) из APIView, но ни один из них, похоже, не работает. Я попытался передать контекст и попытался передать дополнительные **kwargs в __init__, но ни один из них, похоже, не работает.

Есть ли способ достичь этого? Или я ошибаюсь?

Спасибо

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете получить доступ к запросу пользователя на сериализаторе с помощью контекста .

. Как указано в документации, вы всегда можете сделать:

serializer = AccountSerializer(account, context={'request': request})

Таким образом, вы сможете использовать self.context['request'].user в вашем сериализаторе.

Надеюсь, что это то, что вам нужно.

...