2013-12-12 7 views
0

У меня есть модель, Пользователь, и мне нужно создать еще один экземпляр модели, Клиент, в базе данных сразу после того, как Пользователь был сохранен. Чтобы сделать это, я использую приемник, например: ·Откат транзакции в приемнике post_save?

@receiver(models.signals.post_save, sender=User) 
def create_oauth_client(sender, **kwargs): 
    if kwargs['created']: 
       Client.objects.create(user=kwargs['instance'], name="Customer OAuth Client", client_type=1) 

Это работает в нормальных условиях, но если по каким-либо причинам экземпляр клиента не сохраняется, мне нужна возможность откатить создание Заказчика. Есть ли предпочтительный способ сделать это?

+0

Итак, у вас есть 3 модели - клиент, пользователь и клиент? – professorDante

+0

нет. просто пользователь и клиент, обновленный, чтобы отразить это, извините – user1427661

ответ

0

Откат всей транзакции. Взятые непосредственно из документации:

a.save() # Succeeds, but may be undone by transaction rollback 
try: 
    b.save() # Could throw exception 
except IntegrityError: 
    transaction.rollback() 
c.save() # Succeeds, but a.save() may have been undone 

Другими словами, если b.save() терпит неудачу, в вашем случае, сохранение клиента, откатить все это, в том числе a.save(), в вашем случае Сохранение пользователя.

+0

У меня нет доступа к объекту транзакции в методе приемника post_save – user1427661

+0

просто импортируйте его транзакцию импорта django.db, IntegrityError. Это API в транзакции БД. Просто не уверен, что он считается 2 транзакциями, потому что вы используете сигнал. Я полагаю, вы используете сигнал, потому что в кодовой базе есть несколько мест, в которых вы создаете пользователя? – professorDante

+0

Нет, потому что мне нужен клиент, созданный после сохранения пользователя, поэтому post_save выглядел как наиболее эффективный вариант. – user1427661

Смежные вопросы