documentation에 따르면 SlugField
의 최대 길이는 255 자입니다. 하지만 사용하는 백엔드에 따라 다르므로 일 수도 있고 일 수도 있습니다.
SQLite와 PostgreSQL은 max_length
을 UNIQUE
제약 조건으로 500으로 설정할 수 있습니다. PostgreSQL은 실제로 길이 제한을 시행하지만 SQLite는 실제로 신경 쓰지 않으며 선언 된 크기보다 큰 문자열을 삽입 할 수 있습니다.
그러나 MySQL/Mariadb 드라이버는 django/db/backends/mysql/validation.py
에 255 자 제한을 적용합니다. 표준 백엔드 내에서이 제한이있는 것은 유일한 것입니다. 255는 InnoDB 컬럼의 최대 인덱스 키가 767 바이트라는 제한에서 비롯된다. 필요한 경우 UTF8 데이터를 열에 저장하면 문자 당 최대 3 바이트가 소요될 수 있으며 결과는 767/3 = 255 자입니다.
가능한 해결책 중 하나는 슬러그 해시가 포함 된 CharField
입니다. 해당 필드는 짧을 것입니다 (예 : MD5 다이제스트의 경우 32 바이트) 및 중복되는 슬러그가 삽입되는 것을 방지하는 고유 한 필드입니다. 슬러그와 그 해시의 인구는 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_hash
에
IntegrityError
가 발생합니다.
'slug = models.SlugField (unique = True, max_length = 500)'를 할 경우 어떻게됩니까? – Rexford
@Rexford는 백엔드에 의존합니다. 대부분의 시간 데이터는 255로 제한됩니다. – rcmachado
마이그레이션을 사용하고 있습니까 ?? –