我一直在用 custom primary keys对于 Django 中的模型。 (这是因为我正在将值导入数据库并且它们已经附加了 ID,因此保留现有值是有意义的。)
class Transaction(models.Model):
id = models.IntegerField(primary_key=True)
transaction_type = models.IntegerField(choices=TRANSACTION_TYPES)
date_added = models.DateTimeField(auto_now_add=True)
但是,现在我想将模型的新实例添加到数据库中,并且我想自动生成一个唯一的主键。但是,如果我在创建实例时没有指定 ID,则会出现错误:
t = Transaction(transaction_type=0)
t.save()
给出:
IntegrityError at /page
(1048, "Column 'id' cannot be null")
如何自动生成唯一 ID 以指定新值,而不必更改导入现有值的方式?
更新
我写了这个自定义方法,它似乎有效......
class Transaction(models.Model):
def save(self, *args, **kwargs):
if not self.id:
i = Transaction.objects.all().order_by('-id')[0]
self.id = i.id+1
super(Transaction, self).save(*args, **kwargs)
最佳答案
您可以使用 AutoField
为列id
而不是 IntegerField
.以下应该对您有用:
id = models.AutoField(primary_key=True)
id
现在会自动增加并且不会像 save
中可能遇到的并发问题方法。
关于Django:制作自定义 PK 自动增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616787/