Django: сохранить сигнал нескольких объектов один раз - PullRequest
2 голосов
/ 21 декабря 2009

Мне нужна помощь с отправкой электронной почты при размещении заказа. Чтобы проиллюстрировать проблему, ниже приведен абстрактный код:

class Order(models.Model):
    user = models.ForeignKey(User)

class OrderItem(modes.Model):
    order = models.ForeignKey(Order, related_name='items')
    item = models.CharField(max_length=255)
    unit_price = models.DecimalField()
    qty = models.IntegerField()
    item_amount = models.DecimalField()

def email_order_on_save(sender, instance, **kwargs):
    # Need order.items.all() here
    pass

post_save.connect(email_order_on_save, sender=Order)

Большинство проблем в SO и Google, похоже, имеют дело с одним дочерним объектом одновременно; как этот .

Прослушивание OrderItem выдаст 5 сигналов, если 5 элементов заказов будут сохранены из админских сообщений. Кажется, я не могу решить эту проблему. Один из способов, я думаю (не уверен, если это возможно), это прослушивание последнего из всех (5) сигналов OrderItem post_save.

Любая помощь приветствуется.

Ответы [ 4 ]

3 голосов
/ 21 декабря 2009

Полагаю, вы пытаетесь решить эту проблему не в том месте. Отправка электронного письма по завершении заказа и сохранение модели заказа находятся на разных уровнях абстракции.

Я думаю, что отправка электронного письма должна быть вызвана каким-то условием в представлении, которое содержит больше информации о том, полностью ли сохранен заказ или нет. Подумайте, например, что произойдет, если заказ нуждается в обновлении (скажем, его статус меняется)? Если письмо тоже будет отправлено?

1 голос
/ 21 декабря 2009

Вы можете создать свою модель следующим образом

ORDER_STATE = (
    (1, 'Completed'),
    (2, 'Processing'),
)

class Order(models.Model):
    user = models.ForeignKey(User)
    state = models.IntegerField(choices = ORDER_STATE)

У вас может быть много состояний для заказа. Состояние «Завершено» может означать, что обработка заказа завершена. Вы можете изменить состояние вашего заказа в ваших представлениях.

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

1 голос
/ 21 декабря 2009

Создайте свой собственный пользовательский сигнал и отправьте его в тот момент, когда у вас есть данные, которые вы хотите сохранить. Передавайте в качестве параметров любые структуры данных, которые вам нужны.

Слушайте ваш пользовательский сигнал в функции обратного вызова email_order_on_save и принимайте соответствующие решения на основе параметров, касающихся отправки или не отправки электронной почты.

0 голосов
/ 21 декабря 2009

Я думаю, что у вас могут быть проблемы с сигналами, OrderItem со строками не отправит сигнал сохранения, прочитайте this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...