Проблема встречается тогда, когда хочется найти 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:
Так всю жизнь же был `exclude()`:-)
Да, даже в этом случае exclude() даст такой же запрос. В приведенном простом примере exclude даже проще использовать, Q объекты нужны в более сложных вариантах
http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects - здесь подробнее описано.
В моем случае я просто максимально упростил пример что привело к бессмысленности использования ~Q :). Но суть скорее в том чтобы показать что так можно делать, и в более сложных вариантах это может пригодиться.
Post a Comment