人们通常如何处理Django中的类变量?
在Django的文档里,我找不到相关的说明,那大家都是怎么处理这个问题的呢?
我具体的情况是这样的。
我有一个购物车,每个购物车都有一个发票号码的字段。不过,发票号码只有在购物车状态变为已付款时才会生成,所以并不是所有的购物车都有发票号码。我希望所有的发票号码是连续的,中间没有空缺,因此默认的主键(pk)在这种情况下并不合适。所以我想要一个类变量,作为发票号码的计数器,并且所有的购物车实例都能访问到这个计数器。
3 个回答
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)
把它们和购物车关联起来。这样的话,发票可以在需要的时候创建,默认的主键字段可以是一个不断增加的数字,这样发票就可以有自己独立的生命周期,而不必和购物车的对象绑定在一起。
0
你可以在模型里创建一个字段,并把它设为主键,或者如果你在迁移一个旧数据库的话,可以使用你现在的主键,方法是设置primary_key=True。
Django的ORM不支持复杂的主键。也就是说,它不允许你使用没有主键的表。
如果你需要为发票编号生成特定的逻辑(比如客户编号 + '-' + 年份),你可以为这个编号创建一个字段,但它不会是主键。如果当前对象还没有指定这个编号,可以在模型的Model.save函数中调用这个编号生成的函数。
1
默认情况下,主键会是一个独特的、不断增加的整数(即使在SQLite中,如果你没有删除任何记录的话),所以你可以直接用这个作为主键。