簡體   English   中英

如何實現多個過濾器Django?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM