人们通常如何处理django中的类变量?

时间:2010-02-06 15:27:44

标签: python django-models

我在django文档中看不到任何相关规定,所以人们如何做到这一点。

我的具体案例就是这个。

我有一个购物车,每个购物车实例都有一个发票编号字段,但只有当购物车进入付费状态时才会生成发票编号,因此并非所有购物车实例都会有发票编号。我希望所有发票号都是顺序的,它们之间没有间隙,所以在这种情况下默认的pk并不完美,所以我想要一个类变量作为发票号的计数器,并且可以被所有实例访问。 / p>

3 个答案:

答案 0 :(得分:1)

默认主键已经是一个唯一的单调整数(即使在SQLite中,如果你不删除任何记录),所以你可以使用它。

答案 1 :(得分:0)

您可以在模型中创建字段并将其声明为主键,或者在迁移旧数据库primary_key=True时使用当前主键。

Django ORM不支持复杂的密钥。它不允许您使用没有主键的表。

如果您需要生成发票号的特定逻辑(例如客户端号+' - '+年号),您可以为此密钥创建一个字段,但这不是主键。如果尚未为当前对象指定此键,则在Model.save函数中的对象保存上调用此密钥生成函数。

答案 2 :(得分:0)

在您的模型中填写发票字段:

class Cart(models.Model):
 .....
 invoice_id = models.PositiveIntegerField(null=True,unique=True)

仅在适当时设置值。

要查找下一个ID:

try:
  nextID = Cart.objects.exclude(invoice_id=None).order_by('-invoice_id')[0].invoice_id + 1
except IndexError:
  nextID = 1

考虑了一些......我发现发票可能更适合作为一个单独的模型。您可以使用ForeignKey("invoice",null=True)将它们链接到您的购物车。然后可以在需要时创建它们,默认主键字段可以是单调递增的数字,然后可以为购物车对象设置单独的生命周期。