模型的 Django 测试 deleteview 覆盖 'delete' 方法

Django test deleteview for model with overwritten 'delete' method

我正在为包含多个删除视图的 Django 应用程序编写测试。我使用以下代码的变体测试所有删除视图:

#Object exists to begin with
response = self.client.get(reverse('roldelete', kwargs={'pk': self.role.pk}))
self.assertEqual(response.status_code, 200)

#Object Can be deleted can be posted
response = self.client.post(reverse('roldelete', kwargs={'pk': self.role.pk}))
self.assertEqual(response.status_code, 302)

#Object is actually deleted
response = self.client.get(reverse('roldelete', kwargs={'pk': self.role.pk}))
self.assertEqual(response.status_code, 404)

#Query returns an empty result
self.assertFalse(Role.objects.filter(pk=self.role.pk).exists())

所有这些都工作正常,但是,在我的模型中,我已经覆盖了默认的 'delete' 方法。基本上每次我删除 'TenantPurchase' 对象时,我都想检查链接的 'PurchaseRequest' 对象是否存在并将其删除。为此,我在 TenantPurchase 模型中编写了以下代码:

def delete(self, *args, **kwargs):
    try:

        purchase_user = self.user
        purchase_arrangement_period = self.item

        #Import here to avoid circular import
        from arrangement.models import ArrangementBuyRequest

        linked_buy_request = ArrangementBuyRequest.objects.filter(
            user=purchase_user,
            arrangement_period=purchase_arrangement_period) \
            .order_by('request_date').last()

        linked_buy_request.delete()
    except (ArrangementBuyRequest.DoesNotExist, AttributeError) as e:
        pass

    super(TenantPurchase, self).delete(*args, **kwargs)

当我在我们的开发服务器上手动测试时,我表现得很好。已删除链接的购买请求并且不会抛出任何错误。

但是,我对这个模型的所有单元测试都失败了。 它通过了前三个测试(断言 200、断言 302、断言 404)

但是直接查询显示对象仍然存在

self.assertFalse(
        TenantPurchase.objects.filter(tenant=self.tenant, user=self.user, item_id=self.period.pk).exists())


Traceback (most recent call last):
(...), line 105, in test_linked_request_deleted

self.assertFalse(ArrangementBuyRequest.objects.filter(user=self.user,         arrangement_period=self.period).exists())
AssertionError: True is not false

链接的购买请求同上:

# Check if the related buyrequest has been deleted as well
    self.assertFalse(ArrangementBuyRequest.objects.filter(user=self.user, arrangement_period=self.period).exists())

Traceback (most recent call last):
(...), line 80, in test_tenant_purchase_deleted
TenantPurchase.objects.filter(tenant=self.tenant, user=self.user, item_id=self.period.pk).exists())
AssertionError: True is not false

由于这种情况与所有其他(通过)测试之间的唯一区别是模型中覆盖的 'delete' 方法,因此怀疑问题出在该部分(可能未正确加载到测试) 但是我找不到导致测试失败的错误。一切都在我们的开发服务器上运行良好并没有帮助,因此很难查明错误。

有人知道我错过了什么吗?

在解决我自己的一些问题时偶然发现了这个问题,只是想向您指出 。当通过 QuerySet 操作删除对象时(也称为任何批量操作,从管理中删除所有内容等),Django 不会调用模型删除函数并直接与 table 交互。链接的答案提供了一个关于如何解决这个问题的例子,看起来它可能就是你要找的 are/were。