Я использую инфраструктуру Django REST и не могу понять, как отфильтровать результаты подполя (многозначного поля), которое возвращается, когда запрашивается ссылочная модель / представление.
У меня есть модель тега, котораясвязанные с моделью книги через много полей.При запросе тегов он возвращает всю книгу, связанную с ним.Однако мне нужно отфильтровать книги, чтобы они включали только те книги, к которым у текущего пользователя есть доступ.
I может правильно отфильтровать это в виде книги, но не могу понять, какзаставить это работать для представления тегов
// Book model:
class BookQuerySet(models.QuerySet):
def visible_to(self, user):
if user.can_see_secrets:
return self
return self.exclude(secret_book=True)
class Book(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
name = models.CharField(db_column='CatalogNumber', unique=True, max_length=50)
secret_book = models.IntegerField(db_column='secret', default=False)
objects = BookQuerySet.as_manager()
class Meta:
managed = False
db_table = 'book'
app_label = 'core'
// Book view:
class BooksFilteringBackend(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
current_user = request.user
queryset = queryset.visible_to(current_user)
return queryset
class BookViewSet(viewsets.ReadOnlyModelViewSet):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
queryset = Book.objects.all()
filter_backends = (BooksFilteringBackend,)
serializer_class = BookSerializer
There is a BookSerializer that doesnt do anything interesting
Теперь вышесказанное работает, если пользователь запрашивает представление книги, он получает только те книги, которые должен видеть.
Вот моя проблема:
// Tag model
class Tag(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
description = models.CharField(db_column='Description', unique=True, max_length=255)
books = models.ManyToManyField('core.Book', through='BookTag', related_name='tags')
class Meta:
managed = False
db_table = 'tag'
app_label = 'tags'
// Tag viewset
class TagViewSet(viewsets.ReadOnlyModelViewSet):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
queryset = Tag.objects.all()
serializer_class = TagSerializer
// Tag serializer
class TagSerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
description = serializers.CharField(max_length=255)
books = BookSerializer(many=True, read_only=True)
class Meta:
model = Tag
fields = ('id',
'description',
'books',)
Если я коснусь набора просмотра тега, я получу все книги, связанные с тегом, потому что я не фильтрую книги на основе той же логики, описанной выше.Как сделать так, чтобы при извлечении тегов я мог использовать BookQuerySet или что-то подобное.
Цените любые идеи!