Django .filter на тот же вариант с несколькими возможностями - PullRequest
6 голосов
/ 26 апреля 2011

У меня есть модель объектов. У меня также есть список параметров для фильтрации результатов. Я не уверен, существует ли простой способ фильтрации объектов в модели, чтобы возвращался любой объект, соответствующий любому из элементов в списке фильтров. Например:

# returns all users with name starting with 'P'
usersWithPName = User.objects.filter(name__startswith = 'P')
# 3 letters to filter User model with
filterList = ['P', 'T', 'R'] 
# ideally would return all users with name starting with either 'P', 'T', or 'R'
usersWithPTRName = User.objects.filter(name__startswith = filterList) 

Есть ли способ отфильтровать (в данном случае) модель User так, чтобы возвращался любой объект, соответствующий любому из элементов в filterList?

Ответы [ 2 ]

20 голосов
/ 26 апреля 2011

Это можно сделать с объектами Q

from django.db.models import Q
usersWithPTRName = User.objects.filter(Q(name__startswith='P') |
                                       Q(name__startswith='T') |
                                       Q(name__startswith='R')) 

Также вы можете создавать фильтры Q во время выполнения:

filterList = ['P', 'T', 'R']
query = Q()
for letter in filterList:
    query = query | Q(name__startswith=letter)
usersWithPTRName = User.objects.filter(query)
0 голосов
/ 26 апреля 2011

Два варианта.

  1. Включите первую букву в качестве свойства в вашей модели.

  2. Используйте более сложные запросы.

Вы можете сделать это

class User( models.Model ):
    ... all the usual stuff ...
    @property
    def first_letter( self ):
        return self.name[:1]

Теперь вы можете фильтровать с filter( first_letter__in=('P','T','R') )

Второй вариант - создать объекты Django Q для вашего фильтра.

Начните здесь: https://stackoverflow.com/search?q=django+Q+objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...