2016-07-03 3 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 자입니다. 하지만 사용하는 백엔드에 따라 다르므로 일 수도 있고 일 수도 있습니다.

SQLite와 PostgreSQL은 max_lengthUNIQUE 제약 조건으로 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_hashIntegrityError가 발생합니다.

+0

슬러그 필드에 고유 True를 추가하면 어떨까요? 양식이 제출되고 슬러그가 이미 존재하는 것으로 밝혀지면 오류를 어떻게 제기 할 수 있습니까? – stetim94

+0

'SlugField'에 유일한 제약 조건을 추가 할 수 있지만 255 자로 제한됩니다. 중복 슬러그로 레코드를 저장하려고하면 'IntegrityError'가 발생합니다. – mhawke

+0

대단히 고마워요. :) 해결책을 생각해 냈지만 그다지 잘 모르겠습니다. 네가 이걸로 볼 수 있다면 크게 감사하겠다. 그리고 있다면, 내 코드를 어디에 게시해야합니까? 나는 지금 다른 사람의 주제를 납치하고있다, 나는 정말로 그렇게해서는 안된다. – stetim94

관련 문제