我将使用 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)
有两种不同的过滤方式:
如果您的 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)
如果您的 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)
如果您对我的回答或其他任何问题有任何疑问,请告诉我