2016-07-03 14 views
0

スラッグのサイズを500に増やす必要があります。これはデフォルトでは255文字ですが、同時に同じものをユニークに保つ必要があります。それを実現させる方法はありますか?Django:ユニークなスラッグのサイズを増やす

models.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) 

お知らせください。

+0

'/ slug = models.SlugField(unique = True、max_length = 500)'を実行した場合、どうなりますか? – Rexford

+0

@Rexfordはバックエンドに依存しています - ほとんどの場合、データの上限は255です。 – rcmachado

+0

あなたは移行を使用していますか? –

答えて

2

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_hashIntegrityErrorが発生します

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) 

+0

スラッグフィールドに一意のTrueを追加するとどうなりますか?フォームが提出され、スラッグが既に存在することが判明したら、どうすればエラーを発生させることができますか? – stetim94

+0

SlugFieldにユニーク制約を追加できますが、255文字に制限されています。重複したスラッグでレコードを保存しようとすると、 'IntegrityError'が発生します。 – mhawke

+0

ありがとうございました:)私は解決策を考え出しましたが、その良いことはわかりません。もしあなたがこれで大丈夫なら、あなたはそれを見ることができれば大いに感謝しますか?あなたがいるなら、私のコードをどこに投稿すべきですか?私は今、彼の話題を他の誰かに乗っ取っています。本当にすべきではありません。 – stetim94

関連する問題