Задать вопрос
@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. Ваши предложения?
Спаисбо
  • Вопрос задан
  • 175 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • ProductStar
    Django + Python разработка
    2 месяца
    Далее
  • Skillbox
    Python-фреймворк Django
    3 месяца
    Далее
  • Бруноям
    Python-фреймворк Django
    3 месяца
    Далее
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы