Задать вопрос
@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. Ваши предложения?
Спаисбо
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
ITK academy Саратов
от 75 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽