我想在Django中的Model的几个字段中查找某个字符串。理想情况下,它会类似于:
keyword = 'keyword'
fields = ['foo', 'bar', 'baz']
results = []
for field in fields:
lookup = "%s__contains"
results.append(Item.objects.filter(lookup=keyword))
当然这不起作用,因为“查找”无法解析为字段。还有其他办法吗?
答案 0 :(得分:27)
我更喜欢使用Q对象来做这样的事情。
from django.db.models import Q
keyword = 'keyword'
fields = ['foo', 'bar', 'baz']
Qr = None
for field in fields:
q = Q(**{"%s__contains" % field: keyword })
if Qr:
Qr = Qr | q # or & for filtering
else:
Qr = q
# this you can now combine with other filters, exclude etc.
results = MyModel.objects.filter(Qr)
答案 1 :(得分:18)
我认为使用Django查询系统可能有更好的方法。以下是按照自己的方式进行操作的方法。
Python允许您通过在其前面添加**来传递字典以用作参数列表。 运气好的话,你应该可以做这样的事情:
lookup = "%s__contains" % field
results.append(Item.objects.filter(**{ lookup: keyword}))
答案 2 :(得分:5)
我喜欢DialZ的答案,但出于性能原因,您应该构建查询,然后点击数据库一次,而不是将所有结果连接到列表中:
keyword = 'keyword'
fields = ['foo', 'bar', 'baz']
# this makes an empty queryset object which we can
# add to later using the | operator
results = Item.objects.none()
for field in fields:
lookup = "%s__contains" % field
query = {lookup : keyword}
results = results | Item.objects.filter(**query)
我暂时没有做过其中一个,但我很确定django在这段代码中根本不会真正打到数据库。它只会在您访问记录中包含的数据时执行查询