我有兩個模型:
class Book(models.Model):
id = models.CharField(verbose_name="unique id", primary_key=True, max_length=256)
title = models.CharField(max_length=256)
published_date = models.CharField(max_length=128, blank=True, null=True)
average_rating = models.IntegerField(blank=True, null=True, default=None)
ratings_count = models.IntegerField(blank=True, null=True, default=None)
thumbnail = models.URLField(verbose_name="thumbnail url", null=True, blank=True, default=None)
class Author(models.Model):
name = models.CharField(null=True, blank=True, max_length=256)
books = models.ManyToManyField(Book, related_name='authors')
我想要實作的是我想通過使用這樣的查詢引數來過濾 api 查詢:
127.0.0.1/books?author='something'
所以我的引數就是那種情況。
我想按作者姓名過濾并檢查是否有與該作者有關系的書籍。同樣重要的是,此時可能不止一個引數,如下所示:
?author='something1'&author='something2'
我不知道如何實作這一目標。我正在嘗試在 DRF 的通用類中使用 get_queryset 函式進行默認過濾,但仍然不知道。
uj5u.com熱心網友回復:
正確的方法是使用 django-filter:https : //django-filter.readthedocs.io/en/stable/guide/install.html
像這樣:
class BookFilterSet(filters.FilterSet):
class Meta:
model = Book
fields = ['authors']
class BookViewSet(ModelViewSet):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [filters.DjangoFilterBackend]
filterset_class = BookFilterSet
uj5u.com熱心網友回復:
這應該可以通過 DjangoFilterBackend 輕松完成。
您可以嘗試按照此處的步驟操作
在通用過濾下。
如果這不起作用 - 您可以嘗試使用第三方軟體包django-filters:)讓我知道它是怎么回事:)
uj5u.com熱心網友回復:
好的,所以基本上我按照你們的建議使用了 django-filters 包,但我不知道如何通過相同的單個查詢鍵實作多次過濾的效果。
我的意思是,如果有人嘗試按這樣的幾個作者姓名進行過濾:
?author=tolkien&author=jan
那么我如何通過這兩個值“tolkien”和“jan”來過濾資料庫?
我的過濾器集如下所示:
class BookFilter(filters.FilterSet):
author = filters.CharFilter(field_name='authors__name' ,lookup_expr='icontains')
categories__name = filters.CharFilter(lookup_expr='icontains')
published_date = filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Book
fields = ['author', 'categories__name', 'published_date']
并查看這樣的功能:
class BooksView(generics.ListAPIView):
queryset = Book.objects.all()
serializer_class = BooksSerializer
filter_backends = [filters.DjangoFilterBackend,]
filterset_class = BookFilter
我想要實作的效果是使用作者是姓名包含 jan 或 tolkien 的人獲取查詢集
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/323617.html
