我们有Django模型,使用二进制字段作为ID。
# Create your models here.
class Company(models.Model):
id = models.BinaryField(max_length=16, primary_key=True)
name = models.CharField(max_length=12)
class Meta:
db_table = "company"
我们使用MySQL数据库并在迁移时出错。
File "/home/cuongtran/Downloads/sample/venv/lib/python3.5/site-packages/MySQLdb/connections.py", line 270, in query
_mysql.connection.query(self, query)
django.db.utils.OperationalError: (1170, "BLOB/TEXT column 'id' used in key specification without a key length")
你有解决方案吗?我们需要使用MySQL,并希望使用二进制字段作为ID。
谢谢!
答案 0 :(得分:2)
我认为你无法做到这一点。基于Django文档,看起来二进制字段的使用是discouraged
存储原始二进制数据的字段。它只支持字节赋值。 请注意,此字段的功能有限。例如,它是 无法过滤BinaryField值上的查询集。也是 不可能在ModelForm中包含BinaryField。
滥用BinaryField
虽然您可能会考虑将文件存储在数据库中,但请考虑 在99%的情况下这是糟糕的设计。这个字段不是 替换正确的静态文件处理。
基于Django bug,很可能无法对二进制字段实现unique value
限制。此错误标记为wont-fix
。我说的很可能是不可能的,因为我没有找到证据确认二进制字段存储为BLOB field
,但错误确实暗示了它。
说明
当我使用这样的字段时:
text = models.TextField(maxlength=2048, unique=True)
当管理员应用程序进入表格时,它会导致以下sql错误_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'text' used in key specification without a key length")
经过一些调查后发现mysql
拒绝对列使用unique,除非它仅用于文本字段的索引部分:CREATE TABLE `quotes` ( \`id\` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `text` longtext NOT NULL , \`submitTS\` datetime NOT NULL, `submitIP` char(15) NOT NULL, `approved` bool NOT NULL, unique (text(1000)));
当然1000只是我选择的任意数字,它恰好是我的数据库允许的最大值。不完全确定如何解决这个问题,但我认为值得一提。