2015-10-19 9 views
7

मैं एकाधिक विकल्प प्रश्न के लिए एक मॉडल बनाते हैं। प्रत्येक प्रश्न में 5 पसंद उत्तर हैं। और मुझे प्रत्येक प्रश्न वस्तु को प्रश्न और उत्तर के आधार पर अद्वितीय होने की आवश्यकता है। और इसलिए, मैं इस तरह के मॉडल को डिजाइन करता हूं।क्या mysql डीबी बैकएंड के साथ django में अद्वितीय TextField बनाने के लिए वैसे भी है?

1170, "BLOB/TEXT column 'question' used in key specification without a key length"

मैंने पाया इस त्रुटि here चर्चा की गई:

from django.db import models 


class MultipleChoiceQuestion(models.Model): 
    ANSWERS = [('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'd'), ('e', 'e')] 
    question = models.TextField() 
    a = models.TextField() 
    b = models.TextField() 
    c = models.TextField() 
    d = models.TextField() 
    e = models.TextField() 
    true_answer = models.CharField(max_length=1, choices=ANSWERS) 

    class Meta: 
     unique_together = [('question', 'a', 'b', 'c', 'd', 'e')] 

जब मैं migrate चलाने के लिए, mysql इस त्रुटि दे। लेकिन, मैं CharField का उपयोग अपनी छोटी सीमा के साथ नहीं कर सकता, क्योंकि मुझे लंबे टेक्स्ट (10000 char या अधिक तक) स्टोर करने की आवश्यकता है।

sqlite3 और PostgreSQL ऐसा कर सकते हैं (मेरा मतलब Django TEXT के लिए के बारे में महत्वपूर्ण विनिर्देश शिकायत नहीं था)।

कारण मुझे mysql का उपयोग करने की आवश्यकता है क्योंकि सर्वर जहां मैं इस django ऐप को तैनात करूँगा केवल mysql, कोई postgresql प्रदान नहीं करेगा।

तो, क्या मैं वैसे भी इसे प्राप्त कर सकता हूं?

उत्तर

1

ऐसा लगता है कि यह एक django/mysql बग है जहां django blames MySql और "wontfix" है। उनका सुझाव मॉडल से कुंजी छोड़ना है और केवल बाधा को मैन्युअल रूप से जोड़ना है। विशाल हैक लेकिन हाँ, यह शायद एकमात्र समाधान है। यदि आपकी कुंजी 1000 बाइट से अधिक है तो आपको MySQL को फिर से कंपाइल करने की आवश्यकता होगी।

The maximum key length is 1000 bytes. This can also be changed by changing the source and recompiling. For the case of a key longer than 250 bytes, a larger key block size than the default of 1024 bytes is used. From The Manual

मैं सुझाव नहीं देता कि प्रदर्शन और कई हैकरी के आसपास कई कारणों से। पुन: संकलन के बजाय मैं सुझाव देता हूं कि आप एक हैश फ़ील्ड बनाएं जो अद्वितीय है। यह सभी क्षेत्रों का md5 योग बनाता है और हमेशा 32 वर्ण होगा। डुप्लिकेट की बाधाएं 2^128 में 1 हैं इसलिए आप बहुत सुरक्षित हैं।

from django.db import models 
import hashlib 


class MultipleChoiceQuestion(models.Model): 
    ANSWERS = [('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'd'), ('e', 'e')] 
    question = models.TextField() 
    a = models.TextField() 
    b = models.TextField() 
    c = models.TextField() 
    d = models.TextField() 
    e = models.TextField() 
    true_answer = models.CharField(max_length=1, choices=ANSWERS) 
    unique_hash = models.CharField(max_length=32, unique=True) 

    def save(self, *args, **kwargs): 
     m = hashlib.md5() 
     m.update(self.question) 
     m.update(self.a) 
     m.update(self.b) 
     m.update(self.c) 
     m.update(self.d) 
     m.update(self.e) 
     self.unique_hash = m.digest() 
     super(MultipleChoiceQuestion, self).save(*args, **kwargs) 
+0

इतना सहायक! धन्यवाद – fpghost

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