首先,如果我没有用更好的措辞提问,我道歉.我正在建设一个DRF应用程序,我有Products型号,ProductSerializerProductsSummaryView.此外,我还有工作空间模型(不打算谈论它,因为它与问题无关).现在,我想在成功响应中返回这些产品的详细信息,这些产品附加了一个特定的工作空间,根据一些参数进行了筛选.

我所做的是: 我给filterset_fieldsfilter_backends下了定义.它工作得很好.例如,如果我转到这个URL {{domain}}/path/?country__title=Japan,它会过滤日本的数据并显示给我.但问题是,我想使用多标签进行筛选,例如,如果我想查看日本和韩国的详细信息,那么我想要类似{{domain}}/path/?country__title=Japan&country__title=Korea的内容,但它不起作用,它只返回所有详细信息.我甚至try 在URL中添加空列表格式,并try 了这个URL {{domain}}/path/?country__title[]=Japan&country__title[]=Korea,但仍然不起作用.

有人能在这件事上帮我吗?

我的Product型号是:

class Product(BaseModel):
    """Product model to store all prices of a product 和
    related br和 和 countries it's available in"""
    product = models.CharField(max_length=255)
    country = models.ForeignKey(Country, null=True, on_delete=models.DO_NOTHING)
    car_br和 = models.ForeignKey(
        CarBr和, on_delete=models.DO_NOTHING, null=True, blank=True
    )
    part = models.ForeignKey(Part, null=True, blank=True, on_delete=models.DO_NOTHING)
    fzg_segment = models.ForeignKey(
        FZGSegment, on_delete=models.DO_NOTHING, null=True, blank=True
    )
    parts_group = models.ForeignKey(
        PartsGroup, on_delete=models.DO_NOTHING, null=True, blank=True
    )
    last_collected = models.DateField(null=True, blank=True)
    usage_recommendation = models.CharField(max_length=255)
    recommended_action = models.CharField(max_length=255)
    recommended_action_value = models.DecimalField(max_digits=6, decimal_places=2)
    recommended_price = models.DecimalField(max_digits=6, decimal_places=2)
    rrp = models.DecimalField(max_digits=6, decimal_places=2)
    iam_price = models.DecimalField(max_digits=6, decimal_places=2)
    currency = models.ForeignKey(
        Currency, null=True, blank=True, on_delete=models.DO_NOTHING
    )
    iam_index = models.DecimalField(max_digits=6, decimal_places=2)
    factor = models.DecimalField(max_digits=6, decimal_places=2)
    items_count = models.PositiveIntegerField(default=0)
    manufacturer = models.ForeignKey(
        Manufacturer, on_delete=models.DO_NOTHING, null=True, blank=True
    )
    is_in_stock = models.BooleanField(default=True)
    added_at = models.DateField(null=True, blank=True)
    last_in_stock = models.DateField(null=True, blank=True)
    last_searched_at = models.DateField(null=True, blank=True)
    avg_in_stock = models.DecimalField(
        null=True, blank=True, max_digits=6, decimal_places=2
    )

    def __str__(self):
        return self.product

我的ProductSerializer串行化器是:

class ProductSerializer(serializers.ModelSerializer):
    """Serializer for the part object"""
    parts_group = PartsGroupSerializer()
    fzg_segment = FZGSegmentSerializer()

    class Meta:
        model = Product
        fields = (
            "id",
            "product",
            "fzg_segment",
            "parts_group",
            "last_collected",
            "usage_recommendation",
            "recommended_action",
            "recommended_action_value",
            "recommended_price",
            "rrp",
            "iam_price",
            "iam_index",
            "factor",
            "items_count",
        )
        read_only_fields = ("id",)

我的ProductsSummaryViewAPI是:

class ProductsSummaryView(mixins.ListModelMixin, viewsets.GenericViewSet):
    """Viewset to return data for products in a workspace"""
    serializer_class = serializers.ProductSerializer
    permission_classes = (permissions.IsWorkspaceAdminPermission,)
    pagination_class = St和ardSetPagination
    filter_backends = [DjangoFilterBackend]
    filterset_fields = [
        "fzg_segment__title",
        "parts_group__title",
        "car_br和__title",
        "usage_recommendation",
        "recommended_action",
    ]

    def get_queryset(self) -> models.Product:
        """Returns queryset of all the products of a workspace"""
        workspace = self.kwargs["workspace"]
        workspace = get_object_or_404(models.Workspace, pk=workspace)
        return workspace.products.all()

有没有人可以帮助我,让我知道我需要做什么才能实现所需的功能?

UPDATE: 我创建了filters.py个文件,如下所示:

# filters.py

import django_filters
from .models import Product

class ProductFilter(django_filters.FilterSet):
    fzg_segment__title = django_filters.CharFilter(field_name="fzg_segment__title", lookup_expr='in')
    parts_group__title = django_filters.CharFilter(field_name="parts_group__title", lookup_expr='in')
    car_br和__title = django_filters.CharFilter(field_name="car_br和__title", lookup_expr='in')
    part__title = django_filters.CharFilter(field_name="part__title", lookup_expr='in')
    country__title = django_filters.CharFilter(field_name="country__title", lookup_expr='in')
    manufacturer__title = django_filters.CharFilter(field_name="manufacturer__title", lookup_expr='in')

    class Meta:
        model = Product
        fields = [
            "fzg_segment__title",
            "parts_group__title",
            "car_br和__title",
            "part__title",
            "country__title",
            "manufacturer__title",
        ]

我已经更新了我的views.py美元,如下:

# views.py

class ProductsSummaryView(mixins.ListModelMixin, viewsets.GenericViewSet):
    """Viewset to return data for products in a workspace"""
    serializer_class = serializers.ProductSerializer
    permission_classes = (permissions.IsWorkspaceAdminPermission,)
    pagination_class = St和ardSetPagination
    filter_backends = [DjangoFilterBackend]
    filterset_class = filters.ProductFilter

    def get_queryset(self) -> models.Product:
        """Returns queryset of all the products of a workspace"""
        workspace = self.kwargs["workspace"]
        workspace = get_object_or_404(models.Workspace, pk=workspace)
        queryset = workspace.products.all()
        queryset = self.filter_queryset(queryset)
        return queryset

我try 在URL中使用如下过滤器:

{{domain]]/path/?country__title=Japan&country__title=Korea

`{{domain]]/path/?country__title__in=Japan&country__title__in=Korea``

{{domain]]/path/?country__title__in=Japan,Korea

{{domain]]/path/?country__title[]=Japan&country__title[]=Korea

但一切都白费了,我连一个滤镜都用不上,留下多个滤镜.我到底做错了什么?

推荐答案

您需要使用BaseInFilter,例如:

from django_filters.filters import BaseInFilter
from django_filters import rest_framework as filters

class CharInFilter(BaseInFilter, filters.CharFilter):
    pass


class ProductFilterSet(filters.FilterSet):
    country = CharInFilter(field_name="country__title", lookup_expr='in')

    class Meta:
        model = Product
        fields = ["country"]
    

参数URL如下所示: /?country=Japan,Korea

Django相关问答推荐

Django中的判断约束

Django modelform在包含在另一个模板中时不呈现

如何在Django中显示多个相关对象

Django中每个类型/代理的最新行

Django 按月分组并按月显示在模板中

如何将多个模型添加到单个列表视图?

如果一个应用程序有多个具有相同字段的模型,那么保持 DRY 的最佳实践是什么?

Django中的 联合(Union) 和相交(Intersect)

django-rest-framework 如何使模型序列化器字段成为必需

Django 从字段开始

Python 和 Django OperationalError (2006, 'MySQL server has gone away')

在 Django REST Framework 中找不到资源时如何返回 404

如何使用 select_for_update 在 Django 中获取查询?

Heroku - 在 Django 应用程序中处理静态文件

如何动态检索 Django 模型类?

在 docker 容器中创建 django 超级用户而不输入密码

在 Django 中使用 Cython,是否有意义?

django 模板列表变量中的最后一个元素

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

使用 Django REST 框架从多个模型返回结果