Django rest 框架 - 过滤多对多字段

标签 django django-rest-framework

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

class Car(models.Model):
    images = models.ManyToManyField(Image)

class Image(models.Model):
    path = models.CharField()
    type = models.CharField()

我想公开两个 API View :
  • 汽车列表
  • 汽车详情

  • 在 ListView 中,我只想显示 type="thumbnail"的图像。在详细信息 View 中,我想显示 type="image"的图像。

    这或多或少是列表的样子:
    [{
        "id": 1,
        "images": [1, 2],
    },
    {
        "id": 2,
        "images": [3, 4],
    }]
    

    和详细信息 View :
    {
        "id": 1,
        "images": [5],
    }
    

    请注意,根据 View 显示不同的图像 ID。

    到目前为止,我的序列化程序如下所示:
    class CarSerializer(serializers.ModelSerializer):
        images = serializers.ManyPrimaryKeyRelatedField()
    
        class Meta:
            model = Car
    

    列出 api View :
    class CarList(generics.ListAPIView):
        model = Car
        serializer_class = CarSerializer
    

    详细api View :
    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
    

    然后将过滤器添加到您的 View 中:
    class CarList(generics.ListAPIView):
        model = Car
        serializer_class = CarSerializer
        filter_class = CarFilter
    

    就这样。将 "?have_image=1"添加到您的查询字符串中,Django 过滤器应该会为您解决问题。

    希望能帮助到你..

    关于Django rest 框架 - 过滤多对多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14749530/

    相关文章:

    python - 如何在 django-rest-framework 的模型 View 集中取消设置 csrf?

    用于 channel Websocket 身份验证的 Django jwt 中间件

    python - Django 让用户通过表单更新网站上的 TextField 值?

    Django 两步验证

    带有自引用对象的 Django 休息框架嵌套序列化器

    python - 名称 'snippets' 未定义 [Django Rest]

    python - 如何序列化numpy数组?

    python - 编程错误 : (1146, "Table clearinghouse.control_experiment doesn' t 存在”)

    python - 如何分发 Django 应用程序及其特定设置?

    django - 为什么 PyTest 覆盖率报告中缺少我项目的大部分 Django 文件?