2009-02-05 17 views
6

मेरे पास एक बीस बाइट हेक्स हैश है जिसे मैं एक डीजेंगो मॉडल में स्टोर करना चाहता हूं। यदि मैं एक टेक्स्ट फ़ील्ड का उपयोग करता हूं, तो इसे यूनिकोड के रूप में व्याख्या किया जाता है और यह वापस गड़बड़ हो जाता है।एक Django मॉडल फ़ील्ड में एक बाइनरी हैश मान संग्रहीत

वर्तमान में मैं इसे एन्कोड कर रहा हूं और इसे डीकोड कर रहा हूं, जो वास्तव में कोड को बंद कर देता है, क्योंकि मुझे इसके द्वारा फ़िल्टर करने में सक्षम होना चाहिए।

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

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

changeset = property(get_changeset, set_changeset) 

यहाँ छानने के लिए एक उदाहरण है

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

यह दृष्टिकोण है कि एक Django डेवलपर द्वारा सिफारिश की गई थी, लेकिन मैं वास्तव में तथ्य यह है कि यह करने के लिए इस बदसूरत है शर्तों के साथ संबंध के लिए संघर्ष कर रहा हूँ बस बीस बाइट स्टोर करें।

शायद मैं एक शुद्धतावादी का बहुत अधिक है, लेकिन आदर्श मैं

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

लिखने के गुण मुझे लिखने की अनुमति में सक्षम हो जाएगा:

change.changeset = ctx.node() 

ताकि के रूप में मैं कर सकते हैं अच्छा है पूछना।

उत्तर

4

मुझे लगता है कि आप कच्चे एसक्यूएल लिख रहे थे, तो आप पोस्टग्रेस बाइटा या एक MySQL VARBINARY का उपयोग करेंगे। एक ticket with a patch (चिह्नित "जरूरत परीक्षण") है जो स्पष्ट रूप से इस तरह का एक क्षेत्र बनाता है (टिकट 2417: द्विआधारी प्रकार के क्षेत्रों के लिए समर्थन (उर्फ: पोस्टग्रेस में बाइटा और mysql में VARBINARY))।

अन्यथा, आप शायद custom field type लिखने पर अपना हाथ आजमा सकते हैं।

+2

एनबी। इस जवाब के बावजूद चार साल की उम्र के बावजूद, बाइनरीफाल्ड Django (1.5) की नवीनतम रिलीज में नहीं है, लेकिन वर्तमान विकास संस्करण में है। –

3

आप अपना खुद का कस्टम Model Manager भी लिख सकते हैं जो आपके लिए भागने और अनदेखा करता है।

3

"मेरे पास एक बीस बाइट हेक्स हैश है जिसे मैं एक डीजेंगो मॉडल में स्टोर करना चाहता हूं।"

Django यह करता है। वे हेक्स digests का उपयोग करें, जो हैं - तकनीकी रूप से - तार। बाइट नहीं

someHash.digest() का उपयोग न करें - आपको बाइट मिलते हैं, जिन्हें आप आसानी से स्टोर नहीं कर सकते हैं।

someHash.hexdigest() का उपयोग करें - आपको एक स्ट्रिंग मिलती है, जिसे आप आसानी से स्टोर कर सकते हैं।

संपादित करें - कोड लगभग समान है।

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

... GitHub पर उदाहरण कोड पहले w/पर एक छोटे से भ्रामक है:

देखें http://docs.python.org/library/hashlib.html

+0

एक अलग एन्कोडिंग का उपयोग कोड को कोई क्लीनर नहीं बनाता है। अगर मुझे अभी भी एन्कोड करना और डीकोड करना है तो मुझे कुछ भी प्राप्त नहीं हुआ है। – mbarkhau

+1

क्षमा करें अगर मेरे उत्तर ने आपको भ्रमित कर दिया। मैंने इसे संशोधित किया है। डाइजेस्ट() और हेक्सडिजिस्ट() लगभग समान हैं। सिवाय आप हेक्सडिजिस्ट() को जारी रख सकते हैं। आप आसानी से पाचन() को जारी नहीं रख सकते हैं। –

1

यह समस्या अभी भी ब्याज की है, तो Disqus 'django-bitfield बिल फिट बैठता है मॉड्यूल के वास्तविक फ़ंक्शन को आर/टी करें, क्योंकि एसिनेन वेरिएबल नामों की वजह से - आम तौर पर मैं मुश्किल से किसी व्यक्ति के साथ किसी भी प्रकार के व्यक्ति या उच्च जमीन के साथ किसी को एल्स के गूढ़ पहचानकर्ता को कार्य करने के लिए नहीं लेता ... लेकिन flaggy_foo ?? श्रीमान, यू दोस्तों।

यदि वह परियोजना आपके स्वाद के लिए नहीं है, और आप पोस्टग्रेस पर हैं, तो आपके पास बहुत सारे विकल्प हैं क्योंकि कई लोगों ने Django फ़ील्ड के वर्गीकरण के लिए कोड लिखा है और जारी किया है जो पोस्टग्रेस के मूल प्रकार का लाभ उठाते हैं । यहां एक hstore मॉडल फ़ील्ड है:

https://github.com/jordanm/django-hstore - मैंने इसका उपयोग किया है और यह अच्छी तरह से काम करता है।

यहाँ एक पूर्ण-पाठ खोज कार्यान्वयन Postgres 'termvector प्रकार का उपयोग करता है है:

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

और जब मैं इस विशेष परियोजना के लिए ज़िम्मेदार नहीं हैं, वहाँ Django bytea क्षेत्रों के साथ-साथ हैं:

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

+0

व्यक्तिगत रूप से मैं अपने सभी हेक्स हैश को टेक्स्ट के रूप में संग्रहीत करता हूं, लेकिन मुझे कभी भी उनमें से किसी पर इंडेक्स बनाना नहीं था, इसलिए प्रदर्शन की कोई समस्या नहीं है (मुझे लगता है कि आप ऐसा कुछ सामना कर रहे हैं) – fish2000

0

1.6 से शुरू होने पर, Django में BinaryField कच्चे बाइनरी डेटा को स्टोर करने की इजाजत है। हालांकि, 128 बिट्स तक हैश और अन्य मानों के लिए यह Django 1.8+ में उपलब्ध UUIDField का उपयोग करने के लिए अधिक कुशल (कम से कम PostgreSQL बैकएंड के साथ) है।

संबंधित मुद्दे