2015-10-19 14 views
7

Tôi tạo mô hình cho câu hỏi trắc nghiệm. Mỗi câu hỏi có 5 lựa chọn câu trả lời. Và tôi cần mỗi đối tượng câu hỏi là duy nhất dựa trên câu hỏi và câu trả lời của câu hỏi là . Và vì vậy, tôi thiết kế mô hình như thế này.Có anyway để tạo TextField độc đáo trong django với backend mysql db?

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

Khi tôi chạy migrate, mysql cho lỗi này:

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

tôi thấy lỗi này đã được thảo luận here. Tuy nhiên, tôi không thể sử dụng CharField với giới hạn nhỏ, bởi vì tôi cần lưu trữ văn bản dài (cho đến 10.000 char trở lên).

sqlite3 và postgresql có thể thực hiện việc này (ý tôi là django không phàn nàn về thông số chính cho TEXT).

Lý do tôi cần sử dụng mysql vì máy chủ nơi tôi sẽ triển khai ứng dụng django này chỉ cung cấp mysql, không có postgresql.

Vì vậy, có anyway tôi có thể đạt được điều này?

Trả lời

1

Dường như đây là lỗi django/mysql trong đó django blames MySql và "wontfix". Đề xuất của họ là để lại chìa khóa khỏi mô hình và chỉ cần thêm ràng buộc theo cách thủ công. Rất lớn nhưng có, đó có lẽ là giải pháp duy nhất. Tuy nhiên, bạn sẽ cần phải biên dịch lại MySql nếu khóa của bạn vượt quá 1000 byte.

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

Tôi không đề xuất rằng vì một số lý do bao gồm hiệu suất và tất cả xung quanh hackery. Thay vì biên dịch lại, tôi đề nghị bạn tạo một trường băm duy nhất. Điều này tạo ra tổng md5 của tất cả các trường và sẽ luôn là 32 ký tự. Tỷ lệ cược trùng lặp là 1 trong 2^128 nên bạn khá an toàn.

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

Rất hữu ích! cảm ơn – fpghost

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