Monday, August 24, 2009

Django QuerySet API - ограничение выборки по not equal

Продолжим с Django. В стандартном QuerySet API существует большое количество параметров выборки такие как EXACT, CONTAINS, IN, GT, GTE и т.д. Остальные и документацию, если еще кто-то из интересующихся темой не читал, можно прочитать по приведенным ссылкам.

Проблема встречается тогда, когда хочется найти NE что эквивалентно not equal, т.е. когда мы хотим сделать выборку записей в которых определенное поле "не равно" какому то значению. Дело в том что этого почему то нет в queryset api.

Немножко погуглив можно найти решение, а можно его подсмотреть прямо здесь :), причем есть вроде несколько вариантов в последних версиях Django (на момент написания это 1.1). А вот и пример решения задачи.
examples = ExampleModel.objects.filter(
~Q(user=request.user),
is_active=True
)

В результате этого мы получим примерно такой запрос (в моем случае на примере MySQL бекэнда):
SELECT `app_examplemodel`.`id`, `app_examplemodel`.`user_id`, `app_examplemodel`.`is_active` FROM `app_examplemodel` WHERE (NOT (`app_examplemodel`.`user_id` = 1 ) AND `publishers_sites`.`is_active` = True )

Happy coding! 

2 comments:

Александр Кошелев said...

Так всю жизнь же был `exclude()`:-)

Prudnikov Vladimir said...

Да, даже в этом случае exclude() даст такой же запрос. В приведенном простом примере exclude даже проще использовать, Q объекты нужны в более сложных вариантах

http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects - здесь подробнее описано.

В моем случае я просто максимально упростил пример что привело к бессмысленности использования ~Q :). Но суть скорее в том чтобы показать что так можно делать, и в более сложных вариантах это может пригодиться.

Post a Comment