documentationによると、SlugField
の最大長は255文字です。しかし、使用しているバックエンドによっては、かもしれません。それを増やすことができるのは、それを強制するデータベースバックエンドです。
max_length
は、UNIQUE
という制約で500に設定することができます。 PostgreSQLは実際に長さの制限を適用しますが、SQLiteは本当に気にせず、宣言されたサイズよりも大きな文字列を挿入できるようになります。
しかし、MySQL/Mariadbドライバはdjango/db/backends/mysql/validation.py
に255文字の制限を適用します。標準的なバックエンドの中で、これはこの制限を持つ唯一のものです。 255は、InnoDBカラムの最大インデックスキーが767バイトであるという制限から来ています。必要に応じてUTF8データを列に格納すると、1文字につき3バイトまでかかり、767/3 = 255文字になります。
可能な解決策の1つは、スラグのハッシュを含む追加のCharField
を持つことです。そのフィールドは短くなります(MD5ダイジェストでは32バイトなど)と重複するスラッグが挿入されるのを止めるユニークなフィールドになります。スラグとそのハッシュの人口はProduct.save()
で行うことができます。
モデルは次のようになります。同じスラグでレコードを保存しようとする試みが試行された場合は今slug_hash
上IntegrityError
が発生します
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 = models.SlugField(unique = True、max_length = 500)'を実行した場合、どうなりますか? – Rexford
@Rexfordはバックエンドに依存しています - ほとんどの場合、データの上限は255です。 – rcmachado
あなたは移行を使用していますか? –