Кажется, что первичный ключ по умолчанию — int. Есть ли способ использовать большое целое число для автополя в качестве первичного ключа?
Может ли первичный ключ использовать BigInteger в качестве AutoField в Django 1.2.4?
Ответы (8)
Я бы посоветовал вам использовать более новый 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
переопределит идентификатор модели по умолчанию. При использовании это поле автоматически увеличивается с каждым новым объектом модели. Это просто работает!
Я вижу несколько способов реализовать это. В любом случае, вы должны определить свое поле pk.
Прежде всего, просто создайте собственное поле идентификатора и переопределите метод сохранения.
modelname(models.Model):
# model definition
def save(self):
self.pkfield = nextIntFucntion()
super(modelname, self).save()
nextIntFunction()
достаточно просто запросить объекты, упорядоченные по id, а затем получить id+1
Я также нашел эту ссылку BigIntegerField и BigAutoField, которая, кажется, решает проблему, но я не проверял ее сам.
Я тоже встречал такой же вопрос. Я добавил некоторый код, например
User._meta.has_auto_field = True
User._meta.auto_field = id
И я определяю поле id как BigIntegerField(primary_key=True). После того, как я использую user.Save(), user.id будет иметь свой идентификатор, мне не нужно снова запрашивать. Я думаю, что это работает, но это не красивое решение, поэтому я все еще нахожу хороший способ.
Начиная с Django 1.10 вы можете использовать BigAutoField
, как описано в документация работает точно так же, как AutoField
, но это гарантированно подходят числа от 1 до 9223372036854775807.
Таким образом, вы можете использовать его как:
class SomeModel(models.Model):
id = models.BigAutoField()
...
Вы можете взломать 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
(непроверенный код, удачи)
http://docs.djangoproject.com/en/dev/topics/db/models/
класс BigIntegerField([**опции])
доступный вариант:
primary_key Если значение равно True, это поле является первичным ключом модели.
И в конце концов вы выполняете южную миграцию: ALTER TABLE mytable
MODIFY COLUMN myid
BIGINT(20) NOT NULL AUTO_INCREMENT;
Вы правы, извините. Необходимый фрагмент находится здесь:
http://djangosnippets.org/snippets/1244/
Позволяет создавать поля bigint (mysql), bigserial (psql) или NUMBER (19) (oracle), которые имеют автоинкремент, установленный с помощью AutoField django, что обеспечивает обновление идентификатора в экземпляре при вызове его сохранения. ()' метод.
Если бы вы только подклассировали IntegerField к BigIntegerField и использовали бы его в качестве первичного ключа, созданный вами экземпляр модели не получил бы атрибут id, установленный при вызове «save()», вместо этого вам пришлось бы запрашивать и загружать экземпляр из БД еще раз, чтобы получить идентификатор.
Эти фрагменты работают. Используйте класс BigAutoField
в качестве первичного ключа в вашей модели, и он будет работать без каких-либо взломов.