![](/img/trans.png)
[英]How to implement multiple search filters API's at once in django-rest framework?
[英]How to implement multiple filters Django?
我想将这样的过滤器添加到我的网上商店:
Color:
# red
# blue
# green
Material:
# plastic
# wood
# metal
其中每个点都是一个复选框,颜色和材质是一些 Django model 的字段。
例如,如果我正在寻找带有塑料材料的红色或蓝色玩具,我会通过以下方式找到它:
filtered = SomeModel.objects.filter(material=plastic, color=red, color=blue)
但是如何动态过滤它?(如果我有很多过滤器)
你可以这样做
query = SomeModel.objects.filter(material='plastic')
if any_bool_condition:
query = query.filter(color='red')
并且您可以继续在query
中添加filter
。
对于 OR 条件,您应该查看https://stackoverflow.com/a/6567918/3864717
用你想要的颜色构建你的元组,然后在查询中使用__in
。
另外,我在这里放了字符串,但如果你还没有这样做,我建议对这样的事情使用枚举(除非颜色是用户以某种方式定义的)。
# this would be set from incoming checkbox values, and may be empty:
colours_to_filter = ('red', 'blue', 'green')
materials_to_filter = ()
query = SomeModel.objects.all()
if colours_to_filter:
query = query.filter(colour__in=colours_to_filter)
if materials_to_filter:
query = query.filter(material__in=materials_to_filter)
# Import
from django.db.models import Q
filter_query = Q()
# Get colors to be filtered
filter_color_list = ['red', 'blue']
# Add Filter by colors
filter_query.add(Q(color__in=filter_color_list), Q.AND)
# Get materials to be filtered
filter_material_list = ['plastic']
# Add filter by material
filter_query.add(Q(material__in=filter_material_list), Q.AND)
# Get filtered objects
filtered = SomeModel.objects.filter(filter_query)
您可以在 filter_query 中添加任意数量的过滤器,如果没有添加任何过滤器,它将返回 model 的所有对象。
我通常使用query parameters
来进行这些过滤。
它基于用户检查过滤是多个值还是无值。
qs = SomeModel.objects.all()
material = request.GET.get("material")
color = request.GET.get("color")
if material:
qs = qs.fitler(material__in=material)
if color:
qs = qs.fitler(color__in=color)
请注意,有一个名为django-filter的 package 。 您可以使用此 package 进行过滤,它非常有用。
你的form
会是这样的:(示例)
<form action="{% url 'view_url' %}" method="GET">
<input type="checkbox" name="color" value="RED">
<input type="checkbox" name="color" value="GREEN">
<input type="checkbox" name="color" value="BLUE">
<button type="submit" value="Submit">Submit</button>
</form>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.