gpt4 book ai didi

Python Flask SQLalchemy 查询过滤器按 bool 值忽略 False

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:06 29 4
gpt4 key购买 nike

在我的数据库中我有房间,这些房间有多个 bool 值,如 has_tv

用户可以搜索一个城市的房间,他将被重定向到结果页面,在那里他可以找到搜索到的城市中的所有房间。

现在有一个过滤器功能可以过滤当前结果集,例如有电视的房间。为此,用户选中一个值为 has_tv

的复选框

我设法让它工作,但它不会忽略 False 值。这意味着如果用户选中 has_tv 它将为真,但所有其他 bool 值将为假(因为它们未选中)。所以这将只显示 has_tv 为真而其他所有假的结果,我需要查看 has_tv 为真而其他不相关的结果,有些可能是假的,有些是真的。

这就是我使用的 atm:

if form.validate_on_submit():
all_rooms_in_city = Zimmer.query.filter(or_(Zimmer.haustiere_erlaubt.is_(form.haustiere_erlaubt.data), Zimmer.bettwaesche_wird_gestellt.is_(form.bettwaesche_wird_gestellt.data))).all()
else:
all_rooms_in_city = Zimmer.query.order_by(desc("stadt")).all()

这是所有可以检查的值(有很多,所以硬编码所有可能性是不可能的):

class FilterZimmerForm(Form):
haustiere_erlaubt = BooleanField("Haustiere")
bettwaesche_wird_gestellt = BooleanField("Bettwaesche")
grill_vorhanden = BooleanField("grill_vorhanden")
safe_vorhanden = BooleanField("safe_vorhanden")
kuehlschrank_vorhanden = BooleanField("kuehlschrank_vorhanden")
rauchen_erlaubt = BooleanField("rauchen_erlaubt")
parkplatz_vorhanden = BooleanField("parkplatz_vorhanden")
kochmoeglichkeit_vorhanden = BooleanField("kochmoeglichkeit_vorhanden")
restaurant_im_haus_vorhanden = BooleanField("restaurant_im_haus_vorhanden")
handtuecher_werden_gestellt = BooleanField("handtuecher_werden_gestellt")
tv_vorhanden = BooleanField("tv_vorhanden")
waschmoeglichkeit_vorhanden = BooleanField("waschmoeglichkeit_vorhanden")
wlan_vorhanden = BooleanField("wlan_vorhanden")

当然,如果假设其中两个被选中,它会显示所有两个被选中的值都是真的房间,而其他所有房间都无关紧要!

这里是需要该功能的网站截图: enter image description here

编辑:

我似乎找到了一个解决方案,已经测试了几次,它似乎按预期工作,但我觉得这不是最佳实践:

if form.validate_on_submit():

filter_result = []

if form.haustiere_erlaubt.data == True:
filter_result.append(Zimmer.haustiere_erlaubt.is_(True))
if form.bettwaesche_wird_gestellt.data == True:
filter_result.append(Zimmer.bettwaesche_wird_gestellt.is_(True))
if form.grill_vorhanden.data == True:
filter_result.append(Zimmer.grill_vorhanden.is_(True))
if form.safe_vorhanden.data == True:
filter_result.append(Zimmer.safe_vorhanden.is_(True))
if form.kuehlschrank_vorhanden.data == True:
filter_result.append(Zimmer.kuehlschrank_vorhanden.is_(True))
if form.rauchen_erlaubt.data == True:
filter_result.append(Zimmer.rauchen_erlaubt.is_(True))
if form.parkplatz_vorhanden.data == True:
filter_result.append(Zimmer.parkplatz_vorhanden.is_(True))
if form.kochmoeglichkeit_vorhanden.data == True:
filter_result.append(Zimmer.kochmoeglichkeit_vorhanden.is_(True))
if form.restaurant_im_haus_vorhanden.data == True:
filter_result.append(Zimmer.restaurant_im_haus_vorhanden.is_(True))
if form.handtuecher_werden_gestellt.data == True:
filter_result.append(Zimmer.handtuecher_werden_gestellt.is_(True))
if form.tv_vorhanden.data == True:
filter_result.append(Zimmer.tv_vorhanden.is_(True))
if form.waschmoeglichkeit_vorhanden.data == True:
filter_result.append(Zimmer.waschmoeglichkeit_vorhanden.is_(True))
if form.wlan_vorhanden.data == True:
filter_result.append(Zimmer.wlan_vorhanden.is_(True))

for item in filter_result:
all_rooms_in_city = Zimmer.query.filter(item).all()
else:
all_rooms_in_city = Zimmer.query.order_by(desc("stadt")).all()

最佳答案

首先,如果您想避免硬编码,您需要通过某种方式以编程方式获取要用于过滤的属性以及调用表单中的相应字段的内容。我猜你可以扫描 Zimmer 类并获取所有 bool 属性的名称,但现在我只是简单地假设一个字符串列表和属性的名称,其中在表单中名称是相同的:

filter_list = ["haustiere_erlaubt", ...]

然后您需要将过滤器添加到查询中,仅当表单为真时。所以:

if form.validate_on_submit():

query = Zimmer.query

for filter_name in filter_list:
if getattr(form, filter_name).data:
query = query.filter(getattr(Zimmer, filter_name).is_(True)))

all_rooms_in_city = query.all()

我猜你也可以建立一个合适的过滤器的字典并使用filter_by:

filter_dict = { filter_name: True for filter_name in filter_list if getattr(form, filter_name).data }

all_rooms_in_city = Zimmer.query.filter_by(**filter_dict).all()

在您的代码中,您在 for 循环中为每个项目重新定义了 all_rooms_in_the_city,因此实际上只有最后一个过滤器会应用。

关于Python Flask SQLalchemy 查询过滤器按 bool 值忽略 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226607/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com