首先,如果我没有用更好的措辞提问,我道歉.我正在建设一个DRF应用程序,我有Products
型号,ProductSerializer
和ProductsSummaryView
.此外,我还有工作空间模型(不打算谈论它,因为它与问题无关).现在,我想在成功响应中返回这些产品的详细信息,这些产品附加了一个特定的工作空间,根据一些参数进行了筛选.
我所做的是:
我给filterset_fields
和filter_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",)
我的ProductsSummaryView
API是:
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
个
但一切都白费了,我连一个滤镜都用不上,留下多个滤镜.我到底做错了什么?