gpt4 book ai didi

mysql - 有没有办法在 django 中使用 mysql 数据库后端创建唯一的 TextField?

转载 作者:可可西里 更新时间:2023-11-01 06:33:53 25 4
gpt4 key购买 nike

我为多项选择题创建了一个模型。每个问题有5个选择的答案。我需要每个问题对象都是独一无二的问题和答案。因此,我设计了这样的模型。

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 给出了这个错误:

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

我发现这个错误已经被讨论过here .但是,我不能使用CharField 限制很小,因为我需要存储长文本(直到 10000 个字符或更多)。

sqlite3 和 postgresql 可以做到这一点(我的意思是 django 没有提示TEXT 的关键规范)。

我需要使用 mysql 的原因是我将部署它的服务器django 应用程序只提供 mysql,没有 postgresql。

那么,无论如何我可以实现这个目标吗?

最佳答案

看起来这是一个 django/mysql 错误,其中 django blames MySql和“wontfix”它。他们的建议是将 key 从模型中移除,仅手动添加约束。巨大的破解但是是的,这可能是唯一的解决方案。但是,如果您的 key 超过 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 分之一,所以你很安全。

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)

关于mysql - 有没有办法在 django 中使用 mysql 数据库后端创建唯一的 TextField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com