Pode o Django ORM loja não assinado é um inteiro de 64 bits (aka ulong64 ou uint64) em uma forma confiável de back-end maneira não reconhece?

StackOverflow https://stackoverflow.com//questions/10678102

Pergunta

Todos os docs que eu vi implica que você pode ser capaz de fazer isso, mas não há nada oficial w/r/t ulong64/uint64 campos.Há alguns off-the-shelf opções que parecem bastante promissoras nesta área:

  • BigIntegerField ...quase, mas assinado;
  • PositiveIntegerField ...suspeito de 32 bits olhar para o futuro;e
  • DecimalField ...fixa-ponteiro representado com um python decimal tipo, de acordo com o docs -- o que, presumivelmente, se transforma em um analogamente, pedante e lento campo de banco de dados quando socked de distância, à la DECIMAL ou NUMÉRICO PostgreSQL tipos.

...todos olhar como eles pode armazenar um número como esse.Exceto NENHUM DELES IRÁ COMETER, bem como a cada rom-com personagem interpretado por Hugh Grant.

O meu principal critério é que ele funciona com o Django suporte infra-estruturas, sem qualquer if postgresql (...) elif mysql (...) tipo de caso especial absurdo.Após isso, há a necessidade de velocidade -- este é um modelo de campo em um visual-aplicação de base de dados que indexa imagem derivada de dados (e.g.percepção de hashes e extraídos keypoint recursos), permitindo a ordenação e o agrupamento pelo conteúdo das imagens.

Assim:há um bom Django extensão ou o aplicativo que fornece algum tipo de PositiveBigIntegerField que irá atender os meus propósitos?

E, restrição de que:Se há uma forma simples e confiável para usar Django ORM ações para armazenar 64 bits não assinado ints, eu gostaria de conhecê-la.Olha, eu não sou nenhum binário whiz;Eu tenho que fazer dois complementar no papel -- então, se este método de sua envolve a mudança de bits de trapaça, não hesite em explicar o que ele é, mesmo se ataca você, como é óbvio.Obrigado antecipadamente.

Foi útil?

Solução

Apesar de eu não testá-lo, mas você pode querer apenas subclasse BigIntegerField.Original BigIntegerField parece que a (fonte aqui):

class BigIntegerField(IntegerField):
    empty_strings_allowed = False
    description = _("Big (8 byte) integer")
    MAX_BIGINT = 9223372036854775807

    def get_internal_type(self):
        return "BigIntegerField"

    def formfield(self, **kwargs):
        defaults = {'min_value': -BigIntegerField.MAX_BIGINT - 1,
                    'max_value': BigIntegerField.MAX_BIGINT}
        defaults.update(kwargs)
        return super(BigIntegerField, self).formfield(**defaults)

Derivadas PositiveBigIntegerField pode parecido com este:

class PositiveBigIntegerField(BigIntegerField):
    empty_strings_allowed = False
    description = _("Big (8 byte) positive integer")

    def db_type(self, connection):
        """
        Returns MySQL-specific column data type. Make additional checks
        to support other backends.
        """
        return 'bigint UNSIGNED'

    def formfield(self, **kwargs):
        defaults = {'min_value': 0,
                    'max_value': BigIntegerField.MAX_BIGINT * 2 - 1}
        defaults.update(kwargs)
        return super(PositiveBigIntegerField, self).formfield(**defaults)

Embora você deve testá-lo exaustivamente, antes de usá-lo.Se você fizer, por favor, compartilhe os resultados :)

EDITAR:

Eu perdi uma coisa - banco de dados interno de representação.Isto é baseado no valor devolvido pela get_internal_type() e a definição do tipo de coluna é armazenada, por exemplo. aqui no caso do MySQL back-end e determinado aqui.Parece que a substituição db_type() irá dar-lhe controlo sobre a forma como o campo é representado no banco de dados.No entanto, você terá que encontrar uma maneira de voltar para SGBD-valor específico em db_type() verificando connection argumento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top