2017-09-28 1 views
3

장고 모델에 슬러그 필드를 추가해야합니다. null이 아닐 때 더 좋습니다. 그래서 나는기본 속성이 null 인 기존 Django 모델에 고유하지 않은 값을 추가하는 방법

slug = models.SlugField(
    'URL', 
    unique=True, 
    default=id_generator, 
) 

내 id_generator을 모델링 슬러그를 추가하기 위해 노력하고있어 : 내가 변화를 마이그레이션 할 때

import string 
import random 
def id_generator(): 
    size=16 
    chars=string.ascii_lowercase + string.digits 
    return ''.join(random.choice(chars) for x in range(size)) 

문제입니다. 메소드 id_generator가 한 번 호출하고 모든 모델 객체에 대해 동일한 값을 사용합니다. 그래서 나는 독특한 분야에서 중복 entrie 있습니다. 고유 한 값을 생성하려면 어떻게해야합니까? 장고 1.11.5

P. 나는 null = True로 설정하고 저장시 슬러그를 추가하기 위해 모델의 저장 방법을 사용자 정의 할 수 있음을 이해합니다.

+0

사이드 노트 확실히 가장자리 케이스 :이 각 인스턴스에 대해 호출 된 경우에도 고유성을 보장 할 것이다 당신의 id_generator에 아무것도 없습니다. – schwobaseggl

+0

[이미 채워진 모델과 함께 null이 아닌 고유 필드 추가] 가능한 복제본 (https://stackoverflow.com/questions/27749300/add-non-null-and-unique-field-with-already-populated-model) – schwobaseggl

답변

0

가장 중요한 : 당신은 데이터 마이그레이션로 기본 않고,

import uuid 

slug = models.CharField(max_length=64, blank=True, unique=True, default=uuid.uuid4) 

add-unique-fields

  1. 추가 널 (null) = 참으로 예를 들어 가장 좋은 방법은 사용 UUID 수 있으며, 독특한 슬러그에 대한 좋지 발전기가
  2. migrate와 함께 현재 제출 된 설명으로 모델을 변경하십시오.

예를 들어 첫 번째 단계 마이그레이션, YOUMODEL 교체 :

from __future__ import unicode_literals 
import string 
import random 
from django.db import migrations, models 


def id_generator(): 
    size=16 
    chars=string.ascii_lowercase + string.digits 
    return ''.join(random.choice(chars) for x in range(size)) 

def update_slug(pp, schema_editor): 
    for instance in YOUMODEL.objects.all(): 
     #   ^^^^^^^ 
     instance.slug = id_generator() 
     instance.save() 


class Migration(migrations.Migration): 

    operations = [ 
     migrations.AddField(
      model_name='YOUMODEL', 
      #   ^^^^^^^ 
      name='slug', 
      field=models.SlugField(null=True, verbose_name='URL'), 
     ), 
     migrations.RunPython(code=update_slug) 

    ] 
+0

예를 들어 내 id_generator를 사용했습니다. 질문 : 왜 내가이 메서드는 기본값으로 메서드를 설정하고 이전 장고 버전의 모든 모델 인스턴스 값을 생성했기 때문에이 메서드는 단 한 번만 호출합니까? –

+0

django docs [add-unique -fields] (https://docs.djangoproject.com/en/1.11/howto/writing-migrations/#migrations-that-add-unique-fields), 아마도 혼란스러운 점이 있습니까? –

+0

어쩌면) 어쨌든, 답해 주셔서 고맙습니다. –