在编写 Django 测试用例时访问带注释的查询集

accessing annotated queryset while writing Django test cases

我正在尝试编写一个测试用例,它使用通过注释添加的属性,但我的测试用例无法使用它,有什么办法可以修复它吗?谢谢

我模型中的属性:

@property
def amount_net(self):
    net_sum = self.amount_net_sum
    return Decimal(round(net_sum, 2)) if net_sum else Decimal("0.00")

self.amount_net_sum 来自自定义管理器:

class InvoiceManager(models.Manager):

    def get_queryset(self):
        qs = super().get_queryset()
        qs = qs.annotate(amount_net_sum=Sum('line_items__amount_net'))
        return qs

在测试用例中:

self.invoice_test1 = Invoice.objects.create(
            state=InvoiceStatus.NEW, language='en',
            type=InvoiceType.INVOICE,
            created=date(2015, 1, 30),
            recipient=profile, 
        )

self.assertEqual(self.invoice_test1.amount_net, self.line_item_sum_net,
                         'Checks if the invoice calculated and expected values are same')

错误:

AttributeError: 'Invoice' object has no attribute 'amount_net_sum'

对象 self.invoice_test1 是使用您的代码创建的,它不是从数据库中获取的。因此,您的自定义管理器没有被使用,对象也没有被注释。

如果您从数据库中重新获取对象,则应该对其进行注释。然后,您可以在 assertEqual 检查中使用重新获取的对象。

self.invoice_test1 = Invoice.objects.get(pk=self.invoice_test1.pk)

您可能应该更改 amount_net 属性 来处理对象没有 amount_net_sum 属性的情况,而不是让它引发 AttributeError.