конъюнктивный фильтр django __in запрос - PullRequest
0 голосов
/ 21 февраля 2012

Рассмотрим массив тегов, т.

Каждый PhotoSet имеет отношение «многие ко многим» с тегами.

У нас также есть фильтр F (состоящий из набора тегов), и мы хотим вернуть все фотонаборы, которые имеют ВСЕ теги, содержащиеся в F.

,. т.е. если F = ['green', 'dogs', 'cats'], мы хотим, чтобы каждый экземпляр PhotoSet имел все теги в F.

Естественно

PhotoSet.objects.filter(tags__in=F)

Не работает, так как возвращает каждый PhotoSet содержит любой член F.

Я вижу, что можно использовать подобные вещи, используя выражения "Q", но это казалось только для конечного количества конъюнктивных параметров. Это то, что можно сделать, используя понимание списка ??

Заранее спасибо!

РЕДАКТИРОВАТЬ - РЕШЕНИЕ:

Я нашел решение, используя очевидный способ. Простые цепочки фильтров ...

results = PhotoSets.objects
for f in F:
  results = results.filter(tags__in=[f])
results = results.all()

Все время пялился мне в лицо!

1 Ответ

2 голосов
/ 21 февраля 2012

Немного быстро и грязно, но это сработает:

query = None
for tag in F:
    if query is None:
        query = Q(tags=tag)
    else:
        query &= Q(tags=tag)

PhotoSet.objects.filter(query)
...