主键可以使用BigInteger作为Django 1.2.4中的AutoField吗?

时间:2011-01-29 06:11:29

标签: python django

似乎默认主键是int。无论如何使用autofield的大整数作为主键吗?

8 个答案:

答案 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类作为主键,它可以无间断地工作。