似乎默认主键是int。无论如何使用autofield的大整数作为主键吗?
答案 0 :(得分:2)
我可以通过两种方式来实现这一点。无论哪种方式,您都必须定义您的pk字段。
首先,只需创建自己的id字段并覆盖save方法。
modelname(models.Model):
# model definition
def save(self):
self.pkfield = nextIntFucntion()
super(modelname, self).save()
nextIntFunction()
很容易查询按id排序的对象,然后获取id + 1
我还发现此链接BigIntegerField and BigAutoField似乎可以解决问题,但我自己没有测试过
答案 1 :(得分:2)
我也遇到了同样的问题。 我添加了一些像
这样的代码User._meta.has_auto_field = True
User._meta.auto_field = id
我将id字段定义为BigIntegerField(primary_key = True) 在我使用user.Save()之后,user.id将拥有其id,不需要我再次查询。 我认为它有效,但它不是一个漂亮的解决方案,所以我仍然找到了一个好方法。
答案 2 :(得分:2)
我建议你使用更新的Django。官方的Django文档现在不比1.3更远。 1.3是不安全和不受支持的。我意识到这个问题是在3年前提出的,但由于仍然没有接受答案,我会试一试。
在Django 1.6.5中,您可以在模型中执行此操作:
class MyModel(models.Model):
id = models.BigIntegerField(unique=True, primary_key=True)
primary_key=True
将覆盖模型上的默认ID。在使用中,此字段会随每个新模型对象自动递增。它只是有效!
答案 3 :(得分:2)
由于Django 1.10 documentation可以使用left上描述的BigAutoField
完全与AutoField
完全相同,但保证适合从1到9223372036854775807的数字。
所以你可以像:
一样使用它class SomeModel(models.Model):
id = models.BigAutoField()
...
答案 4 :(得分:1)
http://docs.djangoproject.com/en/dev/topics/db/models/
class BigIntegerField([** options])
可用选项是:
primary_key 如果为True,则此字段是模型的主键。
毕竟你做了南迁:
ALTER TABLE mytable
MODIFY COLUMN myid
BIGINT(20)NOT NULL AUTO_INCREMENT;
答案 5 :(得分:1)
您可以破解Django并将默认自动键更改为正确的值。退房:
http://code.djangoproject.com/browser/django/trunk/django/db/backends/mysql/creation.py
from django.conf import settings
from django.db.backends.creation import BaseDatabaseCreation
class DatabaseCreation(BaseDatabaseCreation):
# This dictionary maps Field objects to their associated MySQL column
# types, as strings. Column-type strings can contain format strings; they'll
# be interpolated against the values of Field.__dict__ before being output.
# If a column type is set to None, it won't be included in the output.
data_types = {
'AutoField': 'integer AUTO_INCREMENT',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
您可以使用自己代码中的补丁修改此内容:
DatabaseCreation.data_types['AutoField'] = 'bigint AUTO_INCREMENT'
您还必须修补AutoField类:
http://code.djangoproject.com/browser/django/trunk/django/db/models/fields/__init__.py
(未经测试的代码,祝你好运)
答案 6 :(得分:0)
你是对的,对不起。必要的片段在这里:
http://djangosnippets.org/snippets/1244/
允许创建bigint(mysql),bigserial(psql)或NUMBER(19)(oracle)字段,这些字段通过使用django的AutoField设置自动增量,因此确保在调用时在实例中更新ID它的'save()'方法。
如果您只将IntegerField子类化为BigIntegerField并将其用作主键,那么您创建的模型实例在调用'save()'时将不会设置id属性,而是需要查询并加载实例再次从DB获取ID。
答案 7 :(得分:0)
These snippets工作。在您的模型上使用BigAutoField
类作为主键,它可以无间断地工作。