用于多个关键字组合的Django查询数据库

时间:2015-07-16 21:49:21

标签: python django

我在Django中有一个表格如下:

class TableName(models.Model):
    key_one = models.CharField()
    key_two = models.CharField()
    list = models.TextField()

该表用于为一组用户输入关键字返回list。如果用户输入ABCDEF,则会返回与

相关联的列表
key_one = ABC
key_two = DEF

同时,如果用户输入DEFABC,则它会返回不同的列表。

这两个非常简单。当输入两个以上的关键字时,棘手的部分会发挥作用:ABCDEFGHI

现在查询应检查表格

key_one = ABC
key_two = DEF

key_one = DEF
key_two = ABC

key_one = ABC
key_two = GHI

key_one = GHI
key_two = ABC

key_one = DEF
key_two = GHI

key_one = GHI
key_two = DEF
但是,我似乎无法对这种输入数据进行查询。非常感谢能帮助你解决这个问题。

1 个答案:

答案 0 :(得分:0)

由于查询将包含的逻辑OR的数量,这可能不会很好地执行,但是您可以在单个查询中执行此操作:

from itertools import permutations
from django.db.models import Q

keys = ['ABC', 'DEF', 'GHI']
q_object = None
for key_one, key_two in permutations(keys, 2):
    permutation_q = Q(key_one=key_one, key_two=key_two)
    if q_object is None:
        q_object = permutation_q
    else:
        q_object |= permutation_q

results = TableName.objects.filter(q_object)

另一种处理方式是,如果key_one和key_two只有4个不同的值,其中三个为'ABC', 'DEF', 'GHI',第四个为'XYZ'。那么以下是更好的选择:

results = TableName.objects.all().exclude(
    key_one='XYZ').exclude(key_two='XYZ')

这有利于知道TableName中的唯一值将是key_one或key_two中不包含'XYZ'的值。