Verificar se determinado atributo já existe no banco (save_model)

899 views
Skip to first unread message

Guilherme Carvalho

unread,
Feb 9, 2013, 2:54:01 PM2/9/13
to django...@googlegroups.com
Estou com um problema aqui, que penso ser solucionável no save_model.

Requisitos

1 - Antes de salvar gerar um valor único para setar num atributo do objeto
2 - Verificar se um outro valor já existe no banco de dados, para se existir e não for um change gerar um Exception.

Exemplificando
Tenho uma classe Pessoa, nela tenho um campo primary_key, que dever ser gerado no momento do save, nessa mesma classe eu preciso saber se no momento de criar uma nova instância de Pessoa o campo CPF informado já existe no banco de dados, se existir e não for change eu devo não salvar o objeto e gerar um Exception informando que o valor informado já existe. Para piorar a situação eu tenho um StackedInline com outro formulário.

Esse problema eu devo resolver no admin.py com o save_model mesmo ou tenho outro lugar mais indicado, como no models, via signals.

Atenciosamente,

Guilherme de Carvalho Carneiro
Analista de sistemas
twitter: @GCarneiro
http://djangopeople.net/guilhermecarvalho/

Ernesto Guevara

unread,
Feb 9, 2013, 6:46:18 PM2/9/13
to Django Brasil
Olá! Eu faria isso usando o pre_save do signals. Se a id é gerada antes de salvar o objeto, seria necessário dar um commit=False no save antes.
A verificação do CPF poderia ser feita no forms.py, já que nele existe o método clean no ModelForm. Ao dar um clean no form você verifica se a pessoa existe pelo CPF informado, se existir é lançado um forms.ValidationError("Já existe pessoa cadastrada com este CPF").
Abraço!


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Django Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para django-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Guilherme Carvalho

unread,
Feb 9, 2013, 7:03:42 PM2/9/13
to django...@googlegroups.com

Mas no caso do signals como eu geraria o Exception.

Guilherme Carvalho

unread,
Feb 10, 2013, 7:32:48 AM2/10/13
to django...@googlegroups.com
Seguindo sua dica foi trabalhar o forms.py para adicionar o clean, ficando assim o forms, http://pastebin.com/bBRyKjhB, meu admin está assim: http://pastebin.com/16cwRGJD, realmente não sei onde errei mais ele não está passando pelo clean do forms.

P.S O clean está simples para poder testar.

Atenciosamente,

Guilherme de Carvalho Carneiro
Analista de sistemas
twitter: @GCarneiro
http://djangopeople.net/guilhermecarvalho/


2013/2/9 Ernesto Guevara <egueva...@gmail.com>

Ernesto Guevara

unread,
Feb 10, 2013, 7:49:56 AM2/10/13
to Django Brasil
Olá!
Tente algo assim:
http://pastebin.com/aZi07wk7

Guilherme Carvalho

unread,
Feb 10, 2013, 8:11:52 AM2/10/13
to django...@googlegroups.com
De certa forma funcionou, o problema é que mesmo que eu esteja editando um registro ele vai acusar dizendo que o cpf já existe.

Atenciosamente,

Guilherme de Carvalho Carneiro
Analista de sistemas
twitter: @GCarneiro
http://djangopeople.net/guilhermecarvalho/


2013/2/10 Ernesto Guevara <egueva...@gmail.com>

Ernesto Guevara

unread,
Feb 10, 2013, 8:17:49 AM2/10/13
to Django Brasil
A validação de existência do cpf_cnpj não poderá ocorrer na edição, pois já existe a informação no banco. Neste caso precisaria adicionar um "if" no clean. Se o objeto não existir, ai você faz a validação.

Guilherme Carvalho

unread,
Feb 10, 2013, 8:24:19 AM2/10/13
to django...@googlegroups.com
Foi isso que pensei, muito obrigado pela ajuda estou implementando aqui.

Bom carnaval

Artur

unread,
Feb 15, 2013, 3:57:42 PM2/15/13
to django...@googlegroups.com
Pode ser coisa de noob minha, mas não bastaria colocar um unique no CPF/CNPJ?
E quanto essa campo único gerado no momento do save, dê uma pesquisada no tutorial aprendendo django no planeta terra, ele faz exatamente isso usando signals do django com o campo slug.
Reply all
Reply to author
Forward
0 new messages