【问题标题】:Django rest framework - filter many-to-many fieldDjango rest 框架 - 过滤多对多字段
【发布时间】:2013-01-22 20:36:51
【问题描述】:

假设我有一个这样的模型:

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 示例,但似乎只能过滤列出了哪些对象,而不是列出了列出的对象中的哪些相关对象。

【问题讨论】:

  • 您是否设法过滤了相关对象?我正在尝试做同样的事情,但无法让它发挥作用。
  • 不,我没有。但作为一种解决方法,我嵌套了图像对象而不是显示 id 列表,因此客户端不需要额外的调用 - 所有信息都已经存在。在这里阅读更多:django-rest-framework.org/api-guide/…
  • 嗨@Jacek!我找到了一个可以解决您的问题的解决方案。在下面检查我的答案。

标签: django django-rest-framework


【解决方案1】:

我不知道你是否还在寻找这个答案,但也许它可以帮助其他人。

首先像这样创建一个过滤器类:

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 过滤器应该可以为您解决问题。

希望对你有帮助..

【讨论】:

  • 这不是原始用户所要求的。
【解决方案2】:

我发现了另一个 Stackoverflow 问题,它有一个可以在这里使用的解决方案:

How can I apply a filter to a nested resource in Django REST framework?

(请参阅问题本身的“解决方案”标题下方)

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2019-03-06
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多