[英]Django rest framework - filter many-to-many field
假設我有一個像這樣的 model:
class Car(models.Model):
images = models.ManyToManyField(Image)
class Image(models.Model):
path = models.CharField()
type = models.CharField()
我想公開兩個 API 視圖:
在列表視圖中,我只想顯示 type="thumbnail" 的圖像。 在詳細信息視圖中,我想顯示 type="image" 的圖像。
這或多或少應該是列表的樣子:
[{
"id": 1,
"images": [1, 2],
},
{
"id": 2,
"images": [3, 4],
}]
和細節視圖:
{
"id": 1,
"images": [5],
}
請注意,根據視圖顯示不同的圖像 ID。
到目前為止,我的序列化程序如下所示:
class CarSerializer(serializers.ModelSerializer):
images = serializers.ManyPrimaryKeyRelatedField()
class Meta:
model = Car
列表 api 查看:
class CarList(generics.ListAPIView):
model = Car
serializer_class = CarSerializer
詳情 api 查看:
class CarDetails(generics.RetrieveAPIView):
model = Car
serializer_class = CarSerializer
這當然會為我提供列表中的所有圖像以及詳細信息,並迫使客戶進行額外的調用以獲取應顯示的圖像類型。
有什么通用的方法嗎? 我看過 django-filter 示例,但似乎只能過濾列出了哪些對象,而不是列出了列出的對象中的哪些相關對象。
我不知道你是否還在尋找這個答案,但也許它對其他人有幫助。
首先創建一個像這樣的過濾器類:
class CarFilter(django_filters.FilterSet):
having_image = django_filters.Filter(name="images", lookup_type='in')
class Meta:
model = Car
然后將過濾器添加到您的視圖中:
class CarList(generics.ListAPIView):
model = Car
serializer_class = CarSerializer
filter_class = CarFilter
就這樣。 將 "?have_image=1" 添加到您的查詢字符串中,Django 過濾器應該會為您解決問題。
希望能幫助到你..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.