Criando sua própria função de pesquisa django

Embora depois de criar isso, descobrimos que isso especificamente não é necessário e pode ser substituído por uma expressão de função Q, a capacidade de criar uma pesquisa personalizada era interessante. Aqui está um pequeno exemplo para criar a expressão “NOT LIKE” para o ORM do django.

from django.db.models.fields import Field
from django.db.models.lookups import IEndsWith

@Field.register_lookup
class NotIEndsWith(IEndsWith):
lookup_name
= 'notiendswith'

def get_rhs_op(self, connection, rhs):
return 'NOT ' + connection.operators['iendswith'] % rhs

Você pode usá-lo da seguinte maneira

In [1]: import logging; logging.getLogger('django').setLevel(logging.DEBUG) # to see the output
In [2]: from django.contrib.auth import models
In [3]: models.User.objects.filter(email__notiendswith='@example.com')
Out[3]: 03-06 12:13 django.db.backends DEBUG (0.000) SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."email" NOT LIKE '%@example.com' ESCAPE '' LIMIT 21; args=(u'%@example.com',)
<QuerySet [<User: someuser>]>