2011-02-06 16 views
22

Come si memorizza un "blob" di dati binari utilizzando l'ORM di Django, con un backend PostgreSQL? Sì, so che Django disapprova questo tipo di cose, e sì, so che preferiscono che tu usi ImageField o FileField per questo, ma basti dire che non è pratico per la mia applicazione.Campo modello Blob Django

Ho provato a hackerarlo usando un campo di testo, ma ottengo degli errori occasionali quando i miei dati binari non confermano strettamente il tipo di codifica dei modelli, che è unicode per impostazione predefinita. per esempio.

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

risposta

24

Questo frammento di buono:

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

Questa è forse la soluzione più semplice per memorizzare dati binari in 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) 

Ci sono un paio di altri frammenti di là che potrebbero aiutare.

+0

Grazie. Stavo usando qualcosa di simile, ma quello frammento è molto più semplice. – Cerin

+3

Grazie per il grande frammento. Sai se questo supporta il filtraggio? Ad esempio, "Foo.objects.filter (data = my_file)" elabora 'my_file' tramite' get_data'? – Patrick

10

Ho utilizzato questo campo semplice per backend 'mysql', è possibile modificarlo per altri backend

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

Questo campo personalizzato causa errori quando si utilizza 'syncdb' –

+0

@MichaelWaterfall quale errore? –

+0

Scusate per la mancanza di dettagli, stavo indagando a quel punto. A partire da Django 1.2 il metodo [db_type] (https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field.db_type) accetta un argomento 'connection'. Questa era la causa dell'eccezione durante 'syncdb'. Ho modificato il codice. –

19

Se si utilizza Django> = 1,6, c'è un BinaryField

Problemi correlati