@MAGistr_MTM
Учусь программировать

Как правильно использовать queryset.delete()?

Доброго времени суток.

У меня есть следующие модели:
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. Ваши предложения?
Спаисбо
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
16 апр. 2024, в 14:20
500 руб./за проект
16 апр. 2024, в 14:03
5000 руб./за проект
16 апр. 2024, в 13:17
5000 руб./за проект