Могу ли я отфильтровать модель Django с помощью списка Python? - PullRequest
3 голосов
/ 03 апреля 2010

Скажем, у меня определен модельный объект Person, у которого есть поле с именем Name. И у меня есть список людей:

l = ['Bob','Dave','Jane']

Я хотел бы вернуть список всех записей Person, имя которых , а не в списке имен, определенных в l.

Какой самый питонический способ сделать это?

РЕДАКТИРОВАТЬ: Подумав об этом, я действительно пытался создать подсписок l, который не был представлен в таблице Person. Есть ли эффективный способ сделать это? Я могу придумать несколько способов, но не уверен, насколько они эффективны.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2010

Это должно работать:

Person.objects.exclude(name__in=['Bob','Dave','Jane'])

3 голосов
/ 03 апреля 2010

Переименование l для удобства чтения:

names = ['Bob','Dave','Jane']

Person.objects.[exclude][1](Name__[in][2]=names)

ОБНОВЛЕНИЕ 1: Ответ на второй вопрос (в пункте «РЕДАКТИРОВАТЬ»):

present = Person.objects.values_list('Name', flat=True)
absent = set(names) - set(present)   
# or, if you prefer named functions to the set operator '-'
absent = set(names).difference(present) 

Да, "правая часть" разницы (но не '-') принимает любую итерацию (мне пришлось поискать для подтверждения).

...