gpt4 book ai didi

mysql - 如何向 Django 中的大文本字段添加唯一约束?

转载 作者:行者123 更新时间:2023-11-29 07:18:02 33 4
gpt4 key购买 nike

模型.py:

class PageURL(models.Model):
url = models.TextField(max_length=2048, unique=True)

迁移时出错:

django.db.utils.OperationalError: (1170, "BLOB/TEXT column 'url' used in key specification without a key length")

我考虑过使用 CharField,但 Django 表示此用例的最大长度为 255 个字符。最初我只有 TextField(unique=True) 但决定添加一个 max_length,我听说 URL 通常是 2048,但这并没有帮助消除错误。

我尝试了没有 max_length 和唯一约束集的 CharField。

core.PageURL.url: (fields.E120) CharFields must define a 'max_length' attribute. core.PageURL.url: (mysql.E001) MySQL does not allow unique CharFields to have a max_length > 255.

我设置的解决方案是进入 phpMyAdmin 并手动将结构更改为 varchar(2048) 并向其添加唯一约束。

最佳答案

MySQL 不可能有唯一约束 BLOB/TEXT柱子。参见 this问题的详细解释。

要解决您所处的迁移锁定问题,您需要将迁移回滚到尝试添加 unique=True 之前的状态。对 url 的约束 field 。翻看myapp/migrations对于这个模型,看看那是什么时候。该文件应如下所示:

class Migration(migrations.Migration):

dependencies = [
(<myapp>, <migration name>),
]

operations = [
migrations.AlterField(
model_name='PageURL',
name='url',
field=models.TextField(max_length=2048, unique=True),
),
]

现在,从命令行运行 python3 manage.py migrate <myapp> <migration name>

最后,删除<migration name> 之后的所有迁移.

编辑

我想我至少应该尝试为您的具体情况提供解决方案,尽管我不知道该模型的确切用途。

如果你想要一个唯一的 url 列,你可以试试 FK像这样的关系:

class Url(models.Model):
protocol = models.CharField(max_length=10)
sld = models.CharField(max_length=2048, unique=True)
tld = models.CharField(max_length=10)

class Meta:
unique_together = (('protocol', 'sld', 'tld'),)

def __str__(self):
return f'{self.protocol}://{self.sld}.{self.tld}'

现在在任何需要 url 的模型上专栏,您可以改为执行以下操作:

class SomeModel(models.Model):
url = models.ForeignKey(Url, related_name='url_path', on_delete=models.PROTECT)
url_path = models.CharField(max_length=255)

def get_url(self):
return f'{self.url}/{self.url_path}'

关于mysql - 如何向 Django 中的大文本字段添加唯一约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58160770/

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