django Q as chained .filter () - PullRequest
       58

django Q as chained .filter ()

0 голосов
/ 31 октября 2018

2 модели связаны с отношением «многие ко многим».

class Record():
    working_on_record = models.ManyToManyField(
        UserProfile, related_name="working_on_record", blank=True)

class UserProfile():
    name = CharField...

UserProfile - это просто базовая модель пользователя.

Теперь я хочу запросить поиск записей и проверить, совпадают ли все ключевые слова, но если я это сделаю:

query = Q()
c1 = UserProfile.objects.filter(name__icontains='peter')
query.add(Q(working_on_record__in=c1), Q.AND)

c2 = UserProfile.objects.filter(name__icontains='john')
query.add(Q(working_on_record__in=c2), Q.AND)

set3 = list(models.Record.objects.filter(query))

Set3 пуст, несмотря на то, что есть запись, в которой работают два человека с именами "Джон Смит" и "Питер Паркер". Если я заменю «john» в c2 на «parker», я получу все записи, где над ним работает «peter parker».

Но если я соединю методы фильтра:

set4 = list(models.Record.objects
            .filter(working_on_record__in=c1)
            .filter(working_on_record__in=c2)
       )

set4 не пустой и содержит запись, которую я хочу.

Можно ли изменить Q-запрос, чтобы я получил желаемое поведение? Можно ли выполнить фильтрацию с помощью Q-запроса для одного отношения «многие ко многим» с различными значениями из разных объектов, связанных с AND?

Мне не нравится идея создания цепочки методов фильтра из-за множественного возможного использования Q-запроса, поэтому мне пришлось бы многократно повторять все запросы и объединять их в цепочку.

...