Q:

Django Filter ignorando caracteres/símbolos

Problema
Usuários que cadastram com o email no gmail podem criar várias contas apenas mudando o . (ponto) de lugar. Por exemplo: stack.overflow@gmail.com e stackover.flow@gmail.com direcionam para o mesmo email porem são duas contas no meu site. Então o usuário pode fazer um spam de contas considerando isso.
Dúvida
Gostaria de saber se posso fazer um filter ignorando pontos. Dessa forma, caso tenha @gmail.com no email, eu busco pelo email ignorando ponto tanto na string de busca quando no filter do django. Algo nesse sentido:
User.objects.filter(email = useremail.replace('.').('')).exclude(email__ignore_char = '.')

Dessa forma eu estaria buscando stackoverflow@gmail.com em toda minha base e ignoraria o . nos registros que tenho também.

A:

Um colega meu encontrou um gist com uma solução que resolveu o problema:
from django.db.models import F, Func, Value
if '@gmail.com' in email:
    email_gmail_spam = email.replace('.', '')
    user = User.objects.annotate(
        fixed_email=Func(
            F('email'),
            Value('.'), Value(''),
            function='replace',
        )
    ).filter(fixed_email=email_gmail_spam)

    if user.exists():
        message.error("Ja existe um usuário com este email cadastrado.")

