2015-07-16 2 views
0

У меня есть таблица в Django следующим образом:Джанго запрос к базе данных для нескольких комбинаций ключевых слов

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

таблица используется для возврата list для набора пользовательского ввода ключевых слов. Если пользователь вводит ABC, DEF, он будет возвращать список, связанный с

key_one = ABC 
key_two = DEF 

В то же время, если пользователь вводит DEF, ABC, то он будет возвращать другой список.

Эти два варианта очень просты. Сложная часть вступает в игру при вводе более 2 ключевых слов: ABC, DEF, GHI.

Теперь запрос должен проверить таблицу для

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 

I, однако, не может понять запрос для такого рода входных данных. Было бы очень полезно помочь в этом.

ответ

0

Это, вероятно, не очень хорошо работают из-за количества логического ИЛИ это то, что запрос будет содержать, но вот как вы могли бы сделать это в одном запросе:

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) 

Другой способ справиться с этим, если у вас есть только 4 разных значения для key_one и key_two, где три из них: 'ABC', 'DEF', 'GHI', а четвертый - 'XYZ'. Тогда следующий будет лучшим выбором:

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

Это имеет преимущество, зная, что только значения в TableName будут те, которые не содержат 'XYZ' либо key_one или key_two.

Смежные вопросы