2011-02-06 47 views
22

Làm cách nào để lưu trữ "blob" dữ liệu nhị phân bằng ORM của Django, với phần phụ trợ PostgreSQL? Có, tôi biết Django cau mày khi điều đó, và có, tôi biết họ thích bạn sử dụng ImageField hoặc FileField cho điều đó, nhưng đủ để nói, đó là không thực tế cho ứng dụng của tôi.Trường Mô hình Django Blob

Tôi đã thử hack bằng cách sử dụng TextField, nhưng tôi gặp lỗi không thường xuyên khi dữ liệu nhị phân của tôi không xác nhận nghiêm ngặt kiểu mã hóa mô hình, theo mặc định là unicode. ví dụ.

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

Trả lời

24

đoạn này bất kỳ tốt:

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

này có thể là giải pháp đơn giản nhất để lưu trữ dữ liệu nhị phân trong một 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) 

Có một vài đoạn mã khác có thể hữu ích.

+0

Cảm ơn. Tôi đã sử dụng một cái gì đó tương tự, nhưng đoạn mã đó đơn giản hơn rất nhiều. – Cerin

+3

Cảm ơn bạn đã trích đoạn trích tuyệt vời. Bạn có biết điều này có hỗ trợ lọc không? tức là 'Foo.objects.filter (data = my_file)' có xử lý 'my_file' thông qua' get_data' không? – Patrick

10

tôi đã được sử dụng lĩnh vực đơn giản này cho 'mysql' phụ trợ, bạn có thể sửa đổi nó cho backends khác

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

Trường tùy chỉnh này gây ra lỗi khi sử dụng 'syncdb' –

+0

@MichaelWaterfall lỗi nào? –

+0

Xin lỗi vì thiếu chi tiết, tôi đã điều tra tại thời điểm đó. Kể từ Django 1.2 phương thức [db_type] (https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field.db_type) lấy đối số 'connection'. Đây là nguyên nhân của ngoại lệ trong 'syncdb'. Tôi đã sửa đổi mã. –

0

Ngoài ra, hãy kiểm tra Django Storages' Database Storage:.

Tôi chưa sử dụng, nhưng có vẻ tuyệt vời và tôi sẽ bắt đầu sử dụng nó ngay sau khi tôi đăng câu trả lời của tôi.

19

Nếu bạn đang sử dụng Django> = 1,6, có BinaryField

Các vấn đề liên quan