Django Model.object.get Weirdness Função pre_save

votos
2

Eu fiz uma função que se conecta ao sinal de modelos 'pre_save'. Dentro da função Eu estou tentando verificar se pk da instância de modelo já existe na tabela com:

sender.objects.get(pk=instance._get_pk_val())

A primeira instância do modelo gera um erro. I pegar o erro e gerar um campo lesma do título. Em uma segunda instância, não jogue o erro. Eu verifiquei o valor de instance._get_pk_val () em ambos os casos e eles são os mesmos: Nenhum

Assim:

# This one raises an error in the sluggit function
instance1 = Model(title=title 1)
instance1.save()

# This one doesn't raise an error
instance2 = Model(title=title 2)
instance2.save()

Este é o 3º dia brincando com python e django. Então, eu sinto muito se algo newbish que eu não estou vendo.

Editar:

O Modelo:

class Test(models.Model):
    title = models.CharField(max_length=128)
    slug = models.SlugField(max_length=128)
    slug.prepopulate_from=('title',)

signals.pre_save.connect(package.sluggit, sender=Test)

As noções básicas de função:

def sluggit(sender, instance, signal, *args, **kwargs):
    try:
        sender.objects.get(pk=instance._get_pk_val())
    except:
        # Generate Slug Code

@ S.Lot me disse para substituir o método save () nos comentários. Vou ter que tentar isso. Ainda assim, gostaria de saber por que a segunda chamada para model.objects.get () não está a levantar um erro com este método.

Editar 2 Obrigado @ S.Lot. Substituindo o método save funciona perfeitamente. Ainda assim curioso sobre o método de sinal. Hmm, estranho.

Editar 3 Depois de brincar um pouco mais, descobri que usando instance.objects.get () em vez de sender.objects.get () funciona:

def sluggit(sender, instance, signal, *args, **kwargs):
    try:
        sender.objects.get(pk=instance._get_pk_val())
    except:
        # Generate Slug Code

precisa ser:

def sluggit(sender, instance, signal, *args, **kwargs):
    try:
        instance.objects.get(pk=instance._get_pk_val())
    except:
        # Generate Slug Code

Um inseto? Por alguma razão eu pensei sender.objects.get () seria o mesmo que Test.objects.get ().

Publicado 31/03/2009 em 18:29
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

S. Lott está correto ... uso save(), como você já reconheceu que você começou a fazer.

Quanto à questão do sinal, eu posso honestamente não vejo nada de errado com seu código. Eu mesmo executá-lo localmente-me com sucesso. Tem certeza que você está representando-lo corretamente na questão? Ou que instance2 já não é um objeto de banco de dados existente (talvez uma brincadeira em seu código de teste)?

Respondeu 31/03/2009 em 20:19
fonte usuário

votos
0

Obrigado por postar isso. Os principais resultados do Google (no momento estou postando isso) estão um pouco desatualizados e mostrar a velha maneira de sinais de ligação (que foi recentemente reescritos, aparentemente). Suas edições, com os trechos de código corrigidos me mostrou como ele é feito.

Desejo mais cartazes editados os seus comentários para fazer uma correção na mesma. Obrigado. :-)

Respondeu 24/04/2009 em 04:48
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more