python - 如何在Django中用 "SlugField()"增加 "unique=True"的大小?

标签 python django django-models unique-constraint slug

我需要将 slug 的大小增加到 500,默认情况下为 255 个字符,同时,我还需要保持它的唯一性。有没有办法让它发生?

模型.py:

class Product(models.Model):
    title = models.CharField(max_length=500)
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(max_digits=20, decimal_places=2)
    sku = models.CharField(null=True, max_length=100)
    url = models.URLField(blank=True)
    slug = models.SlugField(unique=True)

请指教。

最佳答案

根据documentation SlugField 的最大长度为 255 个字符。但它是由数据库后端强制执行的,因此,根据您使用的后端,您可能能够增加它。

SQLite 和 PostgreSQL 都允许将 max_length 设置为 500,并带有 UNIQUE 约束。请注意,PostgreSQL 实际上会强制执行长度限制,而 SQLite 并不真正关心,并且允许您插入大于声明大小的字符串。

但是 MySQL/Mariadb 驱动程序将在 django/db/backends/mysql/validation.py 中强制执行 255 个字符的限制。在标准后端中,这是唯一具有此限制的后端。 255 来自 InnoDB 列的最大索引键为 767 字节的限制。如果您在列中存储 UTF8 数据(您必须这样做),则每个字符最多可能需要 3 个字节,这将导致 767/3 = 255 个字符。

一种可能的解决方案是额外添加一个包含 slug 哈希值的 CharField。该字段将很短(例如,MD5 摘要为 32 个字节)并且它将是唯一的,这将阻止插入重复的段。 slug 及其哈希值的填充可以在 Product.save() 中完成。

模型将是:

import hashlib
from django.utils.text import slugify

class Product(models.Model):
    title = models.CharField(max_length=500)
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(max_digits=20, decimal_places=2)
    sku = models.CharField(null=True, max_length=100)
    url = models.URLField(blank=True)
    slug = models.SlugField(max_length=500)
    slug_hash = models.CharField(max_length=32, unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        self.slug_hash = hashlib.md5(self.slug).hexdigest()
        super(Product, self).save(*args, **kwargs)

现在,如果尝试使用相同的 slug 保存记录,则会引发 slug_hash 上的 IntegrityError

关于python - 如何在Django中用 "SlugField()"增加 "unique=True"的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175199/

相关文章:

python - Kivy - 如何更改网格布局内元素的大小?

python - 将字典元素附加到空的 Pandas Dataframe 列中

Django 模型已保存,但返回 None

django - 汇总并注释与 self 的关系

python - 如何检索分配给 Django 中的组的所有权限

python - 在多维数组中追加和搜索

python - 在每个 "X"上分割一个字符串

javascript 事件处理程序在 django 内联表单集中无法正常工作

python - 如何在 python Django 框架中只执行一个进程的运行实例?

python - ram 中的 django 变量