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?
-
12-12-2019 - |
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;eDecimalField
...fixa-ponteiro representado com um pythondecimal
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.
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.