2015-10-19 2 views
7

Ich erstelle ein Modell für Multiple-Choice-Frage. Jede Frage hat 5 Wahl von Antworten. Und ich brauche jedes Frageobjekt, das auf seiner Frage und Antworten einzigartig ist. Und so entwerfe ich das Modell so.Gibt es sowieso eine eindeutige TextField in Django mit MySQL-DB-Backend zu erstellen?

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

Wenn ich migrate laufen, mysql diesen Fehler geben:

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

ich diesen Fehler gefunden hat here diskutiert. Aber ich kann 10 mit seinem kleinen Limit nicht verwenden, weil ich langen Text (bis 10000 Zeichen oder mehr) speichern muss.

sqlite3 und postgresql können dies tun (ich meine, django hat sich nicht über Schlüsselspezifikation für TEXT beschweren).

Der Grund, warum ich mysql verwenden muss, da der Server, auf dem ich diese django-Anwendung bereitstellen wird, nur mysql, keine postgresql bereitstellt.

Also, kann ich das irgendwie erreichen?

Antwort

1

Es sieht aus wie dies ist ein django/mysql Bug wo django blames MySql und "Wontfix" es. Ihr Vorschlag ist, den Schlüssel vom Modell zu lassen und die Einschränkung nur manuell hinzuzufügen. Riesiger Hack aber ja, das ist wohl die einzige Lösung. Sie müssen MySql jedoch neu kompilieren, wenn Ihr Schlüssel 1000 Bytes überschreitet.

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

Ich schlage nicht, dass aus mehreren Gründen einschließlich der Leistung und rund um Hacker. Anstatt neu zu kompilieren, schlage ich vor, dass Sie ein Hash-Feld erstellen, das eindeutig ist. Dies erzeugt eine md5 Summe aller Felder und wird immer 32 Zeichen lang sein. Die Chancen für Duplikate sind 1 in 2^128, also sind Sie ziemlich sicher.

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

So hilfreich! Vielen Dank – fpghost

Verwandte Themen