Если это полезно, вы можете объединить выражения фильтра в Django:
query = Item.objects.filter(attributes__string_value='red').filter(attributes__int_value=3')
Из DOCS :
Это займет начальный QuerySetиз всех записей в базе данных, добавляет фильтр, затем исключение, затем другой фильтр.Конечным результатом является QuerySet, содержащий все записи с заголовком, начинающимся с «Что», которые были опубликованы в период с 30 января 2005 г. по текущий день.
Для этого нужно .filter()
, нос динамическими аргументами:
args = {
'{0}__{1}'.format('attributes', 'string_value'): 'red',
'{0}__{1}'.format('attributes', 'int_value'): 3
}
Product.objects.filter(**args)
Вы можете также (если вам нужно сочетание AND
и OR
) использовать объекты Q Джанго .
Запросы аргументов ключевого слова - в фильтре () и т. Д. - объединяются «И».Если вам нужно выполнить более сложные запросы (например, запросы с операторами OR), вы можете использовать объекты Q.
AQ объект (django.db.models.Q) - это объект, используемый для инкапсуляции коллекцииключевые аргументы.Эти ключевые аргументы указаны как в «Полевых поисках» выше.
Вы бы имели что-то вроде этого вместо того, чтобы иметь все Q objects
в этом фильтре:
** import Q from django
from *models import Item
#assuming your arguments are kwargs
final_q_expression = Q(kwargs[1])
for arg in kwargs[2:..]
final_q_expression = final_q_expression & Q(arg);
result = Item.objects.filter(final_q_expression)
Thisэто код, который я не запускал, он не в моей голове.Считайте это псевдокодом, если хотите.
Хотя это не объясняет, почему способы, которые вы пробовали, не совсем работают.Возможно, это связано с поиском , который охватывает отношения , и таблицами, которые объединяются для получения этих значений.Я бы предложил напечатать yourQuerySet.query
, чтобы визуализировать формирующийся raw SQL
, который поможет вам понять, почему .filter( Q() & Q())
не работает.