在 drf django-filter 中获取具有相同键的多个查询参数

问题描述 投票:0回答:1

我将使用 django-filter 在 Django 模型中执行过滤

一切都很好,但我有两个问题

1.在网址中,我必须发送品牌名称,或者根本不发送品牌名称,如果我将品牌名称发送为空,则会发生错误 -> 我该如何修复它?

http://127.0.0.1:8000/api/products/filtered_data/?brand_name=nike -> correct

http://127.0.0.1:8000/api/products/filtered_data/ -> correct

http://127.0.0.1:8000/api/products/filtered_data/?brand_name= -> 
{
        "brand_name": [
            "Select a valid choice.  is not one of the available choices."
        ]
    }

2.要获得多个品牌,我必须多次发送品牌名称,但我想做

可以发送带有“,”的品牌名称

http://127.0.0.1:8000/api/products/filtered_data/?brand_name=nike&brand_name=guchi -> i have to send brand names like this

http://127.0.0.1:8000/api/products/filtered_data/?brand_name=nike,guchi -> i want to send brand names like this

views.py:

class ProductFilter(filters.FilterSet)
    brand_name = filters.ModelMultipleChoiceFilter(queryset=Brand.objects.all(),)

    class Meta:
        model = Product
        fields = ["has_discount","brand_name","available"]

class filtered_data(ListAPIView):
    authentication_classes = []
    permission_classes = []
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filterset_class = ProductFilter

models.py:

class Brand(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Product(models.Model):
    category = models.ManyToManyField(Category, related_name='cat_product')
    name = models.CharField(max_length=200)
    has_discount = models.BooleanField(default=False)
    brand_name = models.Foreignkey(Brand,  on_delete = models.CASCADE)
    brand_image = models.ImageField(null=True,blank=True,upload_to='product')
    create = models.DateTimeField(auto_now_add=True)
    available = models.BooleanField(default=True)
    discount = models.IntegerField(blank=True, null=True)
django django-rest-framework django-filter
1个回答
0
投票

有两种不同的过滤方式:

  1. 如果您的 query_params 包含名称列表,则查询如下,

    您将像这样发送brand_name,它应该是列表

    http://127.0.0.1:8000/api/products/filtered_data/?**brand_name**=['nike,guchi']

    您的查询将类似于:

    queryset=Brand.objects.filter(brand_name__in=brand_name)

  2. 如果您的 query_params 包含单个名称,则查询如下,

    您将像这样发送品牌名称

    http://127.0.0.1:8000/api/products/filtered_data/?brand_name='nike'

    现在您的查询将会有所不同:

    queryset=Brand.objects.filter(brand_name=brand_name) queryset=Brand.objects.filter(brand_name__exact=brand_name) queryset=Brand.objects.filter(brand_name__iexact=brand_name) queryset=Brand.objects.filter(brand_name__contains=brand_name)

如果您对我的回答或其他任何问题有任何疑问,请告诉我

© www.soinside.com 2019 - 2024. All rights reserved.