Por que o sinal post_save do Django me fornece dados pre_save?

Estou tentando conectar um object “Information” a muitos “clientes” (veja o código abaixo)

Quando um object de Informações é atualizado, desejo enviar um email para cada Cliente conectado às Informações.

No entanto, quando eu registro o campo sold_to que o sinal recebe, eu sempre obtenho o que os dados são como ANTES de salvar.

Eu estou supondo que isso é porque seu ManyToManyField e os dados são armazenados em uma tabela separada, mas o sinal post_save não deve ser chamado após todas as relações terem sido atualizadas?

Alguém tem uma sugestão para uma solução?

class Customer name = models.CharField(max_length=200) category = models.ManyToManyField('Category',symmetrical=False) contact = models.EmailField() class Information name = models.CharField(max_length=200) email = models.EmailField(max_length=200) mod_date = models.DateTimeField(auto_now=True) sold_to = models.ManyToManyField(Customer, null=True, blank=True) def send_admin_email(sender, instance, signal, *args, **kwargs): from myapp import settings for cust in instance.sold_to.all(): settings.debug(cust.name) post_save.connect(send_admin_email, sender=Information) 

Edit: apollo13 em #django me alertou para isso: “Itens relacionados (as coisas que estão sendo salvas na relação muitos-para-muitos) não são salvos como parte do método save de um modelo, como você descobriu.” – http://groups.google.com/group/django-users/msg/2b734c153537f970

Mas desde a sua partir de 9 de julho de 2006 eu realmente espero que exista uma solução para isso.

Há um ticket aberto para o problema que você está enfrentando aqui . Você pode ficar de olho nisso quando for lançado, ou tentar aplicar o patch que ele fornece e ver se isso ajuda.

Esta é a minha solução, depois de aplicar o patch do code.djangoproject.com mencionado acima.

Adicionado isso em models.py:

 from django.db.models.signals import m2m_changed m2m_changed.connect(send_admin_email, sender=Information) 

E a function send_admin_email:

 def send_customer_email(sender, instance, action, model, field_name, reverse, objects, **kwargs): if ("add" == action): # do stuff 

Eu me deparo com o mesmo problema desde que eu tenho campos M2M no meu modelo eu também tenho os dados como pre_save.

Na situação, o problema é que nos campos M2M os dois modelos relacionados devem ser salvos para obter os IDs gerados automaticamente.

Na minha solução, nem usei o sinal post_save nem o sinal m2m_changed, em vez dos sinais usei os methods log_addition e log_change na definição de class ModelAdmin.

Na sua class personalizada do ModelAdmin:

  class CustomModelAdmin(admin.ModelAdmin): def log_addition(self, request, object): """ Log that an object has been successfully added. """ super(CustomModelAdmin, self).log_addition(request, object) #call post_save callback here object created def log_change(self, request, object): """ Log that an object has been successfully changed. """ super(CustomModelAdmin, self).log_change(request, object) #call post_save callback here object changed 

Se você quiser, você também pode replace o método log_deletion ().

Feliz anulando …