Armazenamento de um valor de hash binário em um campo modelo de Django

votos
6

Eu tenho um hex de hash de vinte byte que eu gostaria de armazenar em um modelo de Django. Se eu usar um campo de texto, ele é interpretado como unicode e ele volta ilegível.

Atualmente estou codificação-lo e decodificá-lo, o que realmente atravanca o código, porque eu tenho que ser capaz de filtrar por ele.

def get_changeset(self):
    return bin(self._changeset)

def set_changeset(self, value):
    self._changeset = hex(value)

changeset = property(get_changeset, set_changeset)

Aqui está um exemplo para a filtragem

Change.objects.get(_changeset=hex(ctx.node()))

Esta é a abordagem que foi recomendado por um desenvolvedor de Django, mas eu realmente estou lutando para chegar a um acordo com o fato de que é este feio para armazenar apenas vinte bytes.

Talvez eu sou demasiado de um purista, mas o ideal é que eu seria capaz de escrever

Change.objects.get(changeset=ctx.node())

As propriedades permitir-me para escrever:

change.changeset = ctx.node()

Então, isso é tão bom quanto eu posso pedir.

Publicado 05/02/2009 em 19:51
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

Estou assumindo que se você estivesse escrevendo SQL cru que você estaria usando um bytea Postgres ou VARBINARY MySQL. Há um bilhete com um patch (marcado "precisa de testes") que supostamente faz com que um campo como este (Ticket 2417: Suporte para campos binários tipo (aka: bytea no postgres e VARBINARY no mysql)).

Caso contrário, você provavelmente poderia tentar a sua mão em escrever um tipo de campo personalizado .

Respondeu 05/02/2009 em 20:23
fonte usuário

votos
3

"Eu tenho um hex de hash de vinte byte que eu gostaria de armazenar em um modelo de django."

Django faz isso. Eles usam digere hexadecimais, que são - tecnicamente - cordas. Nem bytes.

Não use someHash.digest()- você começa bytes, que você não pode facilmente armazenar.

Use someHash.hexdigest()- você começa uma corda, que você pode facilmente armazenar.

Editar - O código é quase idêntico.

veja http://docs.python.org/library/hashlib.html

Respondeu 06/02/2009 em 01:59
fonte usuário

votos
3

Você também pode escrever seu próprio costume Gerente Modelo que faz a escapar e unescaping para você.

Respondeu 05/02/2009 em 20:52
fonte usuário

votos
1

Se este problema ainda é de interesse, Disqus' django-bitfieldse encaixa no projeto:

https://github.com/disqus/django-bitfield

... o código de exemplo no GitHub é um pouco confuso no início w t função real / r / dos módulos, por causa dos nomes de variáveis asinino - geralmente estou dificilmente o tipo de pessoa com tanto os meios ou o terreno elevado para levar alguém elses' identificadores patetas a tarefa ... mas flaggy_foo?? Srsly, U caras.

Se esse projeto não está ao seu gosto, e você está no Postgres, você tem um monte de excelentes opções como muitas pessoas têm escrito e lançado código para uma variedade de campos de Django que aproveitam tipo nativo Postgres'. Aqui está um hstorecampo de modelo:

https://github.com/jordanm/django-hstore - Eu tenho usado essa e funciona bem.

Aqui está uma implementação de pesquisa de texto completo que usa tipos termvector Postgres':

https://github.com/aino/django-pgindex

E enquanto eu não posso garantir para este projecto específico, há Django byteacampos assim:

https://github.com/aino/django-arrayfields

Respondeu 19/09/2012 em 15:22
fonte usuário

votos
0

Começando com 1.6, o Django tem BinaryFieldpermitindo armazenar dados binários brutos. No entanto, para outros valores hash e até 128 bits que é mais eficiente (pelo menos com o PostgreSQL) para usar UUIDFielddisponível no Django 1.8+.

Respondeu 09/08/2017 em 12:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more