2015-10-19 5 views
7

私は多項選択問題のモデルを作成します。各質問に5つの選択肢があります 回答そして、それはそれに基づいてユニークであるために各質問オブジェクトが必要です 質問と回答。そして、私はこのようなモデルを設計します。私はmigrateを実行するとmysql dbバックエンドでdjangoに独自のTextFieldを作成する方法はありますか?

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')] 

は、MySQLのこのエラーを与える:私はこのエラーがhereを議論してきた

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

ました。しかし、 CharFieldを使用することはできません。長いテキスト (10000文字以上まで)を保存する必要があるため、小さな制限があります。

sqlite3とpostgresqlはこれを行うことができます(私はdjangoがTEXTの 鍵の仕様について不平を言っていないことを意味します)。

私がこの djangoアプリをデプロイするサーバーがmysql、postgresqlを提供しないため、mysqlを使用する必要がある理由です。

私はこれを達成できましたか?

答えて

1

これは、django blames MySqlと "wontfix"というdjango/mysqlバグのようです。彼らの提案は、キーをモデルから離して、手動で制約を追加することです。巨大なハックだが、それはおそらく唯一の解決策だろう。ただし、キーが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