Почему сигнал Django post_save дает мне данные pre_save? - PullRequest
9 голосов
/ 03 августа 2009

Я пытаюсь подключить объект «Информация» ко многим «Клиентам» (см. Код ниже)

Когда обновляется один информационный объект, я хочу отправить электронное письмо каждому клиенту, который подключен к информации.

Тем не менее, когда я регистрирую поле sold_to, которое получает сигнал, я всегда получаю, как данные перед ДО сохранения.

Я предполагаю, что это потому, что его ManyToManyField и данные хранятся в отдельной таблице, но разве не следует вызывать сигнал post_save после обновления всех отношений?

Кто-нибудь получил предложение для решения?

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)

Редактировать: apollo13 в #django предупредил меня об этом: «Связанные элементы (вещи, сохраняемые в отношении« многие ко многим ») как вы обнаружили, не сохраняются как часть метода сохранения модели. "- http://groups.google.com/group/django-users/msg/2b734c153537f970

Но с 9 июля 2006 года я действительно надеюсь, что есть решение для этого.

Ответы [ 3 ]

5 голосов
/ 03 августа 2009

Есть открытый билет на проблему, с которой вы столкнулись здесь . Вы можете либо следить за этим, когда он превратится в релиз, либо попробовать применить предоставленный патч и посмотреть, поможет ли это.

1 голос
/ 07 февраля 2012

Я столкнулся с той же проблемой, так как в моей модели есть поля M2M, я также получил данные типа pre_save.

В данной ситуации проблема заключается в том, что в полях M2M обе связанные модели должны быть сохранены для получения автоматически сгенерированных идентификаторов.

В моем решении я не использовал ни сигнал post_save, ни сигнал m2m_changed, вместо этих сигналов я использовал методы log_addition и log_change в определении класса ModelAdmin.

В вашем пользовательском классе 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

При желании вы также можете переопределить метод log_deletion ().

Счастливое переопределение ...

1 голос
/ 09 августа 2009

Это мое решение, после применения патча с code.djangoproject.com, упомянутого выше.

Добавлено это в models.py:

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

И функция send_admin_email:

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