簡體   English   中英

Django rest 框架——過濾多對多字段

[英]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 過濾器應該會為您解決問題。

希望能幫助到你..

我發現了另一個 Stackoverflow 問題,它有一個可以在這里使用的解決方案:

如何將過濾器應用於 Django REST 框架中的嵌套資源?

(請參閱問題本身的“解決方案”標題下)

我想出了這個解決方案:
它絕對不是優化的,但可以用於快速修復或用於業余項目。

所以在序列化所有應用程序之后,我循環數據以獲得所需的結果,append 它在一個數組中並將其作為響應發送回來。

模型文件:

在此處輸入圖像描述

視圖文件:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM