Может ли первичный ключ использовать BigInteger в качестве AutoField в Django 1.2.4? - PullRequest
4 голосов
/ 29 января 2011

Кажется, что первичным ключом по умолчанию является int. Есть ли в любом случае использовать большое целое число для автополя в качестве первичного ключа?

Ответы [ 8 ]

2 голосов
/ 07 марта 2017

Начиная с Django 1.10 вы можете использовать BigAutoField, как описано в документации работает точно так же, как AutoField, но гарантированно соответствует числам от 1 до 9223372036854775807.

Так что вы можете использовать его как:

class SomeModel(models.Model):
    id = models.BigAutoField()
    ...
2 голосов
/ 14 декабря 2011

Я тоже встречал тот же вопрос. Я добавил немного кода, например

User._meta.has_auto_field = True
User._meta.auto_field = id

И я определяю поле id для BigIntegerField (primary_key = True) После того, как я использую user.Save (), у user.id будет свой идентификатор, мне больше не нужно запрашивать. Я думаю, что это работает, но это не красивое решение, поэтому я все еще нахожу хороший способ.

2 голосов
/ 09 сентября 2014

Я бы посоветовал вам использовать более новый Django.Официальная документация по Django не идет дальше 1,3.А 1.3 небезопасен и не поддерживается.Я понимаю, что вопрос был задан более 3 лет назад, но поскольку до сих пор нет принятого ответа, я дам ему шанс.

В Django 1.6.5 вы можете просто сделать это в своей модели:1004 *

primary_key=True переопределит идентификатор по умолчанию для модели.При использовании это поле автоматически увеличивается с каждым новым объектом модели.Это просто работает!

2 голосов
/ 07 февраля 2011

Есть несколько способов реализовать это.В любом случае, вы должны определить свое поле ПК.

Прежде всего, просто создайте свое собственное поле id и переопределите метод сохранения.

modelname(models.Model):
    # model definition

def save(self):
    self.pkfield = nextIntFucntion()
    super(modelname, self).save()

nextIntFunction() достаточно просто с запросом объектов, упорядоченных по id, затем получитеid + 1

Я также нашел эту ссылку BigIntegerField и BigAutoField , которая, кажется, решает проблему, но я сам не проверял ее

1 голос
/ 09 февраля 2011

Вы можете взломать 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

(непроверенный код, удачи)

1 голос
/ 29 января 2011

http://docs.djangoproject.com/en/dev/topics/db/models/

class BigIntegerField ([** опции])

Доступная опция:

primary_key Если True, это поле является первичным ключом для модели.

И в конце концов вы выполняете миграцию на юг: ALTER TABLE mytable MODIFY COLUMN myid BIGINT (20) NOT NULL AUTO_INCREMENT;

0 голосов
/ 26 июля 2013

Эти фрагменты работают. Используйте класс BigAutoField в качестве первичного ключа для вашей модели, и он работает без всякого взлома.

0 голосов
/ 29 января 2011

Вы правы, извините.Необходимый фрагмент здесь:

http://djangosnippets.org/snippets/1244/

Позволяет создавать поля bigint (mysql), bigserial (psql) или NUMBER (19) (oracle), для которых автоинкремент устанавливается виспользуя AutoField для django, следовательно, гарантируя, что идентификатор обновляется в экземпляре при вызове его метода 'save ()'.

Если бы вы только подкласс IntegerField делили на BigIntegerField и использовали его в качестве основного ключа, ваша модельэкземпляр, который вы создаете, не получит установленный атрибут id при вызове save (); вместо этого вам придется запросить и загрузить экземпляр из БД снова, чтобы получить идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...