web-dev-qa-db-fra.com

Django Champ de modèle Blob

Comment stockez-vous un "blob" de données binaires à l'aide de l'ORM de Django, avec un backend PostgreSQL? Oui, je sais Django fronce les sourcils sur ce genre de chose, et oui, je sais qu'ils préfèrent que vous utilisiez ImageField ou FileField pour cela, mais il suffit de dire que ce n'est pas pratique pour mon application.

J'ai essayé de le pirater en utilisant un TextField, mais j'obtiens parfois des erreurs lorsque mes données binaires ne confirment pas strictement le type d'encodage des modèles, qui est unicode par défaut. par exemple.

psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xe22665
29
Cerin

Cet extrait tout bon:

http://djangosnippets.org/snippets/1597/

Il s'agit probablement de la solution la plus simple pour stocker des données binaires dans un TextField.

import base64

from Django.db import models

class Foo(models.Model):

    _data = models.TextField(
            db_column='data',
            blank=True)

    def set_data(self, data):
        self._data = base64.encodestring(data)

    def get_data(self):
        return base64.decodestring(self._data)

    data = property(get_data, set_data)

Il y a quelques autres extraits qui pourraient vous aider.

26
Spacedman

Si vous utilisez Django> = 1.6, il y a BinaryField

25
Sarah Messer

J'utilise ce champ simple pour le backend 'mysql', vous pouvez le modifier pour d'autres backends

class BlobField(models.Field):
    description = "Blob"
    def db_type(self, connection):
        return 'blob'
10
Anurag Uniyal

Consultez également Stockage de la base de données de Django Storages: .

Je ne l'ai pas encore utilisé, mais il a l'air génial et je vais commencer à l'utiliser dès que je posterai ma réponse.

0
Ben Roberts