2015-01-08 1 views
0

나는 '프로젝트'모델을 가지고 있으며, 'Alan Parson 's', 'Gutenberg', 'Gutenberg'및 'X'라는 이름으로 4 가지 모델을 만들었습니다. ,해당 필드에 대해 고유하지 않은 값을 가진 모델 객체를 만든 후 장고 '고유'모델 필드 매개 변수를 설정합니까?

난 그냥 실현

, 나는 이름이 고유해야 할, 그래서 내가 다른 '구텐베르크'또는 'X'또는 무엇이든을 만들 수 없습니다, 지금 project.name 필드

에 = 진정한 독특한 설정 하지만 django는 이전 모델에 고유하지 않은 이름이 있다는 사실에 아무런 문제가 없습니다.

장고는 새로운 필드의 고유성을 어떻게 보장합니까? 왜 오래된 것들이 고유하지 않은 것이 중요하지 않은가? 그리고 일반적으로 모델 필드 속성 (null, blank, unique ... 등)이 모델 필드 속성에 '어려운'변경을 요구하는지 db 스키마 및 마이그레이션?


, 나는 이름이 고유하지 않은 방법에 대해 오류가 나는 시도하고 (모델 양식에서)이 아닌 고유 한 이름으로 기존 프로젝트 중 하나를 편집하는 경우처럼 보이지만 나는이 액세스 할 수 있습니다 모델링에 아무런 문제가 없으며 많은 객체에 경고없이 객체를 추가 할 수 있습니다. 이것은 마지막 질문과 관련이 있습니다. 모델에 지정된 매개 변수 중 일부는 모델 양식이 작동하는 방식과 작동 방식이 결정되는 것처럼 보입니다. 나는 blank = true가 모델 양식 필드가 비어있을 수 있다는 것을 의미한다고 생각하지만 실제 필드 자체가 데이터가없는 경우 null = true가 '강함'을 의미합니다.

그래서, 기본적으로, 쉽게 매개 변수 변경 사항 마이그레이션 또는 필요로 확인할 수있는 방법이있다 '하드'변경 DB

+0

Django의 마이그레이션을 사용하는 경우 고유 제한 조건이 열에 추가됩니다. 필드에'unique = True'를 추가하는 것만으로는 마이그레이션하지 않고 스키마를 수정할 수 없습니다. 거의 모든 ** 모델 필드를 변경하려면 마이그레이션이 필요합니다. – Brandon

답변

2

documentation for unique는 말한다 :

이는 데이터베이스 수준에서 적용됩니다 그리고 모델 검증에 의해.

당신이 모델 검증 부분을 받고있는 것처럼 소리를 설명하고 행동 (예를 들어, 어떤 당신이 ModelForm을 사용하여 새 개체를 추가 할 때 장고 않습니다)하지만 데이터베이스 제약 부분; 이는 모델을 변경 한 후에 마이그레이션을 성공적으로 작성 및 실행하지 못했다는 것을 거의 확실하게 의미합니다.

더 넓게, 일부 모델 필드 매개 변수는 장고의 동작에 영향을주고 일부는 데이터베이스에 영향을 미친다는 점을 정확하게 알아 두십시오. null은 데이터베이스 제약 조건을 생성하지만 blankModelForms에 영향을줍니다. default은 항상 Django에서 처리하지만 db_index은 데이터베이스에 영향을줍니다. 그리고 unique 모두에 영향을 미칩니다.

"기본적으로 어떤 매개 변수 변경이 마이 그 레이션 또는 '하드'db 변경을 필요로하는지 쉽게 알 수있는 방법이 있습니까?

마이그레이션이 필요한지 확인하는 쉬운 방법은 makemigrations입니다. 마이그레이션이 생성되면 필요한 것이므로 실행해야합니다. the documentation가 말한대로하지만, 그 변경 사항이 데이터베이스 접촉하는 것을 의미하지 않습니다

장고 귀하의 모델이나 필드에 어떤 변화를 마이그레이션 할 것입니다 - 데이터베이스에 영향을주지 않아도 옵션을 -는 AS를 필드를 올바르게 재구성 할 수있는 유일한 방법은 기록의 모든 변경 사항을 저장하는 것입니다. 나중에 일부 데이터 마이그레이션에서 이러한 옵션이 필요할 수 있습니다.

대부분의 경우 구별이 중요하지 않습니다. 하지만주의를 기울이는 가장 좋은 방법은 매개 변수에 대한 문서를 읽고 생성 된 마이그레이션을보고 수행중인 작업을 확인하는 것입니다.

+0

좋은 답변을 보내 주셔서 감사합니다. 이 부분에 관한 내용은 "이며 이는 모델을 변경 한 후에 마이그레이션을 성공적으로 생성하고 실행하지 못했다는 것을 의미합니다." 마이 그 레이션 메시지에 --fake 플래그가 있는데, 문서가 의미하는 바가 무엇인지에 대해 이해하지 못했습니다. 왜냐하면 당신이 매우 명확하기 때문에 그걸 보여줄 수 있습니까? – amchugh89

+0

@ amchugh89 : "--fake 옵션은 Django에 마이그레이션이 적용되었거나 적용되지 않았 음을 표시하지만 실제로 SQL을 실행하여 데이터베이스 스키마를 변경하지는 않습니다." 이 기능을 실제로 사용하는 유일한 경우는 기존 앱을 사용하여 이전을 시작할 때입니다 (예 : 1.7로 업그레이드 한 경우). 중요한 것은 먼저 초기 마이그레이션을 생성하고 (--fake'를 사용하여 적용), * 만 모델에 변경을 가하는 것입니다. 이 시점에서 평소와 같이 마이그레이션을 만들고 실행합니다. –

+0

다시 한 번 감사드립니다. 매우 유익합니다. – amchugh89

관련 문제