gpt4 book ai didi

django - 动态组合 Q() - OR 对象

转载 作者:行者123 更新时间:2023-12-04 14:24:13 24 4
gpt4 key购买 nike

我正在尝试在我拥有的这个 ListView 中创建一个动态搜索。我的想法是每次尝试继承此 View 时指定字段和搜索类型。

我的问题是,每次我尝试进行搜索时,它都只对元组的第一个字段起作用。在我的示例中:requests__email 是第一个字段,当我在查询“app”后打印对象 query_q 时,我得到以下输出:

(OR: (AND: ), ('requests__email__icontains', 'app'), (AND: ('requests__email__icontains', 'app'), ('status__icontains', 'app')), (AND: ('requests__email__icontains', 'app'), ('status__icontains', 'app'), ('license_type__name__icontains', 'app')))

我不明白为什么,因为我正在使用运算符,我认为它可以在 query_q |= Q(**query_kwargs) 中运行 |=。如果我尝试根据其他属性(例如 status)进行搜索,搜索将不起作用。

View .py

class DefaultListView(ListView):
searchable_fields = (
('requests__email', 'icontains'),
('status', 'icontains'),
('license_type__name', 'icontains'),
)

def get_queryset(self):
form = self.form_class(self.request.GET)

if form.is_valid():
if not self.searchable_fields:
raise AttributeError('searchable_fields has not been configured.')
term = form.cleaned_data['term']
query_kwargs = dict()
query_q = Q()

# Build a list of Q objects based on the searchable attribute
for field, search_type in self.searchable_fields:
query_kwargs["{0}__{1}".format(field, search_type)] = term
query_q |= Q(**query_kwargs)

ordering = self.get_ordering()
queryset = self.model.objects.filter(query_q)

if ordering:
return queryset.order_by(**ordering)

return queryset
return super(DefaultListView, self).get_queryset()

最佳答案

如果您想将查询构建为 X = Y OR W = Z,那是因为

query_kwargs["{0}__{1}".format(field, search_type)] = term

您在循环的每次迭代中向 query_kwargs 添加更多键,而不是重新创建变量会建议这样的东西

for field, search_type in self.searchable_fields:
query_q |= Q(**{"{0}__{1}".format(field, search_type): term})

关于django - 动态组合 Q() - OR 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49197030/

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