python - language - Almacenamiento de un valor de hash binario en un campo de modelo de Django
django sqlite3 (5)
Supongo que si estuvieras escribiendo SQL crudo, estarías usando un bytea de Postgres o un VARBINARIO de MySQL. Hay un boleto con un parche (marcado como "necesita prueba") que supuestamente hace un campo como este (Boleto 2417: Soporte para campos de tipo binario (también conocido como: bytea en postgres y VARBINARY en mysql)).
De lo contrario, probablemente podría intentar escribir un tipo de campo personalizado .
Tengo un hash hexadecimal de veinte bytes que me gustaría almacenar en un modelo django. Si utilizo un campo de texto, se interpreta como unicode y vuelve confuso.
Actualmente estoy codificando y decodificando, lo que realmente complica el código, porque tengo que poder filtrar por él.
def get_changeset(self):
return bin(self._changeset)
def set_changeset(self, value):
self._changeset = hex(value)
changeset = property(get_changeset, set_changeset)
Aquí hay un ejemplo para filtrar
Change.objects.get(_changeset=hex(ctx.node()))
Este es el enfoque que fue recomendado por un desarrollador de django, pero realmente estoy luchando para aceptar el hecho de que es tan feo almacenar solo veinte bytes.
Tal vez soy demasiado purista, pero idealmente podría escribir
Change.objects.get(changeset=ctx.node())
Las propiedades me permiten escribir:
change.changeset = ctx.node()
Así que eso es tan bueno como puedo preguntar.
También puede escribir su propio Administrador de modelo personalizado que hace el escapado y el escapado por usted.
"Tengo un hash hexadecimal de veinte bytes que me gustaría almacenar en un modelo django".
Django hace esto. Usan digeridos hexadecimales, que son, técnicamente, cadenas. No bytes
No use someHash.digest()
- obtiene bytes, que no puede almacenar fácilmente.
Usa someHash.hexdigest()
- obtienes una cadena, que puedes almacenar fácilmente.
Editar - El código es casi idéntico.
Si este problema todavía es de interés, el django-bitfield
Disqus encaja perfectamente:
https://github.com/disqus/django-bitfield
... el código de ejemplo en GitHub es un poco confuso al principio w / r / t la función real de los módulos, debido a los nombres de las variables asíncronas; en general, no soy el tipo de persona con los recursos o el terreno elevado para tomar los identificadores ridículos de alguien más ... ¿pero flaggy_foo
? Srsly, U chicos.
Si ese proyecto no es de tu gusto, y estás en Postgres, tienes muchas opciones excelentes ya que mucha gente ha escrito y publicado código para una variedad de campos de Django que aprovechan el tipo nativo de Postgres. Aquí hay un campo de modelo hstore
:
https://github.com/jordanm/django-hstore - Lo he usado y funciona bien.
Aquí hay una implementación de búsqueda de texto completo que usa los tipos de termvector de Postgres:
https://github.com/aino/django-pgindex
Y aunque no puedo dar fe de este proyecto específico, también hay campos Django bytea
:
Comenzando con 1.6, Django tiene BinaryField
permite almacenar datos binarios en bruto. Sin embargo, para hash y otros valores de hasta 128 bits es más eficiente (al menos con el backend de PostgreSQL) usar UUIDField
disponible en Django 1.8+.