Доброго времени суток.
У меня есть следующие модели:
class Account(models.Model):
user = models.ForeignKey(
'users.User', on_delete=models.CASCADE, related_name='accounts'
)
balance = models.DecimalField(decimal_places=2, max_digits=22)
currency = models.CharField(max_length=3, choices=CURRENCY_CHOICES)
def __str__(self):
return f'<Account {self.user.email} ({self.currency.upper()})({self.pk})>'
class Transaction(models.Model):
transaction_type = models.CharField(max_length=16, choices=TRANSACTION_TYPE_CHOICES)
amount = models.DecimalField(decimal_places=2, max_digits=22)
currency = models.CharField(max_length=3, choices=CURRENCY_CHOICES)
account_receiver = models.ForeignKey(
'accounts.Account', on_delete=models.CASCADE,
related_name='transactions_received'
)
account_sender = models.ForeignKey(
'accounts.Account', on_delete=models.SET_NULL,
related_name='transactions_send', blank=True, null=True,
)
def __str__(self):
return f'<Transaction {self.transaction_type}({self.pk})>'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
TransactionHelper(transaction=self).apply_transaction()
def delete(self, *args, **kwargs):
super().delete(*args, **kwargs)
TransactionHelper(transaction=self).revert_transaction()
Как видно есть счет, и транзакции к нему. Когда создаю транзакцию, я ее применяю к счету, а когда удаляю - откатываю ее. Все ок работает, когда удалять из админки из детальной страницы транзакции. Но когда удалать со списка, то не работает, так там не вызывается метод
delete
модели.
Нашел, что удаление происходить через метод
delete_queryset
в
ModelAdmin
. Вот собственно он:
def delete_queryset(self, request, queryset):
"""Given a queryset, delete it from the database."""
queryset.delete()
Как мне лучше и правильнее откатить транзакции в таком случае?
1. Сначала пробежать по всему
queryset
-у и откатить все транзакции, потом удалить
queryset
? Но что, когда по какой-то причине, удаление не прошло успешно: удалились не все записи, ничего не удалилось, и тд?
2. Итерировать по
queryset
-у и одна за одной откатывать транзакции удаляя их?
3. Ваши предложения?
Спаисбо