默认方法参数中的 Django objects.count() returns 0

Django objects.count() in default method parameter returns 0

我还是 Django 的新手,对以下内容感到很困惑:

我有一个用于测试的辅助函数,它创建模型实例 "Product",设置一些属性并将实例保存到 db:

def createTestProduct(product_group="VG", opno="MyProduct"+str(Product.objects.count())):
    p = Product()
    p.product_group = product_group
    p.own_product_no = opno
    p.save()
return p

当我从 TestCase 调用此函数时,默认参数 "opno" 未获得数据库中正确的产品数:

class ProductListPageTest(TestCase):

    def test_product_list_displays_products(self):
        createTestProduct()
        print("# of Products: " + str(Product.objects.count()))
        print(Product.objects.all())
        createTestProduct()
        print("# of Products: " + str(Product.objects.count()))
        print(Product.objects.all())
        ...

结果输出是(Product 模型的 __str__ 方法输出 own_product_no 属性):

# of Products: 1
[<Product: MyProduct0>]
# of Products: 2
[<Product: MyProduct0>, <Product: MyProduct0>]

我的意图是为产品编号:MyProduct0、Myproduct1... 谁能指出我的错误? 非常感谢! 菲尔德

函数参数在定义时计算一次,因此您不应在 def 语句中使用任何计算。这种情况的解决方法是:

def createTestProduct(product_group="VG", opno=None):
    if opno is None:
        opno = "MyProduct%s" % Product.objects.count()
    ...