我在django文档中看不到任何相关规定,所以人们如何做到这一点。
我的具体案例就是这个。
我有一个购物车,每个购物车实例都有一个发票编号字段,但只有当购物车进入付费状态时才会生成发票编号,因此并非所有购物车实例都会有发票编号。我希望所有发票号都是顺序的,它们之间没有间隙,所以在这种情况下默认的pk并不完美,所以我想要一个类变量作为发票号的计数器,并且可以被所有实例访问。 / p>
答案 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)
将它们链接到您的购物车。然后可以在需要时创建它们,默认主键字段可以是单调递增的数字,然后可以为购物车对象设置单独的生命周期。