2009-02-05 24 views
6

Tôi có băm hex mười hai byte mà tôi muốn lưu trữ trong mô hình django. Nếu tôi sử dụng một trường văn bản, nó được hiểu là unicode và nó trở lại bị cắt xén.Lưu trữ giá trị băm nhị phân trong trường mô hình Django

Hiện tại tôi đang mã hóa và giải mã nó, điều này thực sự làm lộn xộn mã, bởi vì tôi phải có khả năng lọc theo nó.

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

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

changeset = property(get_changeset, set_changeset) 

Dưới đây là một ví dụ cho việc lọc

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

Đây là phương pháp được khuyến cáo của một nhà phát triển django, nhưng tôi thực sự đấu tranh để đi đến thỏa thuận với thực tế là nó này xấu xí chỉ lưu trữ hai mươi byte.

Có lẽ tôi quá nhiều của một purist, nhưng lý tưởng tôi sẽ có thể viết

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

Các thuộc tính cho phép tôi viết:

change.changeset = ctx.node() 

Vì vậy, đó là tốt như tôi có thể hỏi.

Trả lời

4

Tôi giả sử nếu bạn đang viết SQL thô, bạn sẽ sử dụng Postgres bytea hoặc MySQL VARBINARY. Có một số ticket with a patch (được đánh dấu là "nhu cầu thử nghiệm") có mục đích tạo ra một trường như thế này (Vé 2417: Hỗ trợ cho các trường kiểu nhị phân (aka: bytea trong postgres và VARBINARY trong mysql)).

Nếu không, có thể bạn có thể thử tay bằng cách viết custom field type.

+2

n.b. mặc dù câu trả lời này là bốn tuổi, BinaryField không có trong bản phát hành mới nhất của Django (1.5) nhưng có trong phiên bản phát triển hiện tại. –

3

Bạn cũng có thể viết tùy chỉnh Model Manager tùy chỉnh của riêng bạn mà thoát và không thoát cho bạn.

3

"Tôi có băm hex mười hai byte mà tôi muốn lưu trữ trong mô hình django".

Django thực hiện việc này. Họ sử dụng hex tiêu hóa, đó là - kỹ thuật - dây. Không phải byte.

Không sử dụng someHash.digest() - bạn nhận được các byte mà bạn không thể dễ dàng lưu trữ.

Sử dụng someHash.hexdigest() - bạn nhận được một chuỗi mà bạn có thể dễ dàng lưu trữ.

Chỉnh sửa - Mã gần giống.

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

+0

Sử dụng mã hóa khác không làm cho mã sạch hơn. Nếu tôi vẫn phải mã hóa và giải mã thì tôi đã không đạt được gì cả. – mbarkhau

+1

Xin lỗi nếu câu trả lời của tôi làm bạn bối rối. Tôi đã sửa đổi nó. digest() và hexdigest() gần giống nhau. Ngoại trừ bạn có thể tiếp tục hexdigest(). Bạn không thể dễ dàng tiếp tục tiêu hóa(). –

1

Nếu vấn đề này vẫn còn quan tâm, Disqus' django-bitfield fits các hóa đơn:

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

... mã ví dụ trên GitHub là một chút bối rối lúc đầu w/r/t chức năng thực tế của mô-đun, vì tên biến asinine - nói chung tôi hầu như không phải là loại người với một trong hai mặt bằng hoặc mặt đất cao để lấy một số định danh ngốc nghếch của ai đó vào nhiệm vụ ... nhưng flaggy_foo ?? Srsly, U guys.

Nếu dự án đó không phù hợp với sở thích của bạn và bạn đang sử dụng Postgres, bạn có nhiều tùy chọn tuyệt vời vì nhiều người đã viết và phát hành mã cho một loạt các lĩnh vực Django. . Đây là trường mô hình hstore:

https://github.com/jordanm/django-hstore - Tôi đã sử dụng nó và nó hoạt động tốt.

Dưới đây là một văn bản đầy đủ thực hiện tìm kiếm sử dụng Postgres' loại termvector:

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

Và trong khi tôi không thể xác minh cho dự án cụ thể này, có Django bytea lĩnh vực cũng như:

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

+0

Cá nhân tôi lưu trữ tất cả các băm hex của tôi dưới dạng văn bản, nhưng tôi không bao giờ phải tạo chỉ mục trên bất kỳ trang nào để tìm kiếm hiệu suất không phải là vấn đề (tôi lấy nó bạn đang đối mặt với một cái gì đó như thế) – fish2000

0

Bắt đầu với 1.6, Django có BinaryField cho phép lưu trữ dữ liệu nhị phân thô. Tuy nhiên, đối với băm và các giá trị khác lên đến 128 bit thì hiệu quả hơn (ít nhất là với phần phụ trợ PostgreSQL) để sử dụng UUIDField có sẵn trong Django 1.8+.

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