我需要将 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/