Django-makemigrations-변경 사항이 감지되지 않았습니다


138

makemigrations 명령을 사용하여 기존 앱 내에서 마이그레이션을 만들려고했지만 "변경 사항이 감지되지 않았습니다"가 출력됩니다.

일반적으로 startapp명령을 사용하여 새 앱을 만들지 만이 앱을 만들 때이 앱에 사용하지 않았습니다.

디버깅 후 migrations패키지 / 폴더가 앱에서 누락되어 마이그레이션을 생성하지 않는 것으로 나타났습니다 .

폴더가 없거나 누락 된 경우 폴더를 만드는 것이 더 좋습니까?


13
INSTALLED_APPS에 앱을 추가 했습니까?
wolendranh 2016 년

6
예, 그것은 설치된 앱에 처음 makemigrations <myapp>으로 Alasdair가 지적한대로 사용하는 것이 좋습니다 .
Dilraj

1
'abstract = True'제거 :)
GrvTyagi

'makemigrations'가 작동하지 않았습니다. 'makemigrations <myapp>'이 (가) 작동 함
Aseem

답변:


266

앱의 초기 마이그레이션을 만들려면 makemigrations앱 이름을 실행 하고 지정하십시오. 마이그레이션 폴더가 생성됩니다.

./manage.py makemigrations <myapp>

앱은 INSTALLED_APPS먼저 settings.py 내부에 포함되어야합니다 .


15
왜 그들이 <때때로> 우리가 앱을 지정하도록 강요합니까?
maazza

40
@maazza 앱에 migrations폴더 가없는 경우 앱 이름을 지정해야 합니다. 앱을 수동으로 만들었거나 이전 버전이없는 이전 버전의 Django에서 업그레이드 한 경우 발생할 수 있습니다.
Alasdair

13
@maazza 사실 __init__.py앱에 'migrations'라는 python 패키지가 필요합니다 .
Jibin

3
장고가 자동으로 처리해야하는 것 같습니다.
duality_ 2016 년

1
@duality_ 이것은 의도적으로 설계된 것 입니다 -Django 앱의 마이그레이션을 원한다고 가정하지 않습니다. 모든 앱에 대해 마이그레이션을 만든 경우을 (를) 실행할 때 오류가 발생할 수 있습니다 migrate.
Alasdair

49

내 문제 (및 해결책)는 위에서 설명한 것과 여전히 다릅니다.

나는 models.py파일을 사용하지 않고 models디렉토리를 만들고 my_model.py거기에 파일을 만들었습니다 . Django가 내 모델을 찾지 못해 적용 할 마이그레이션이 없다고 썼습니다.

내 해결책은 : my_app/models/__init__.py파일 에서이 줄을 추가했습니다. from .my_model import MyModel


이것은 나에게도 해결책이되었지만 이것이 왜 그런지 이해하지 못합니다. 이 문제의 원인에 대한 통찰력이 있습니까?
Paul in 't Hout

장고에는 모델을 찾을 수있는 기본 경로가 있습니다. 프로젝트 구조가 다르고 모델이 일반적인 위치에 있지 않은 경우 가져와야합니다.
Karina Klinkevičiūtė

그런 모델을 제거하려면 어떻게해야합니까?
Daniil Mashkin

@DaniilMashkin 수입품도 제거해야한다고 생각합니다. 이 프로젝트를 (안 하나) 구조화의 방법 중 하나입니다 그리고 당신은 당신이 그것을 선택하는 경우 : 그와 함께 제공되는 추가 작업을 처리해야
카리나 Klinkevičiūtė

1
모델에 "클래식"아키텍처를 사용한 다음 "모델 폴더"아키텍처로 마이그레이션했으며 기존 모델에서 마이그레이션이 여전히 감지되었습니다. 그러나 이제 모델을 만들 때이 문제가 있습니다. 귀하의 솔루션은 잘 작동하지만 때로는 가져 오기가 있기 때문에 때로는 코드베이스가 일치하지 않습니다. 더 나은 해결책이있을 수 있습니다. 장고는 새 모델을 찾을 때 찾을 폴더 목록이있는 설정을 제안해야한다고 생각합니다.
David D.

43

django가 makemigrations명령 중에 마이그레이션 할 대상을 감지하지 못하는 여러 가지 이유가 있습니다 .

  1. 마이그레이션 폴더 앱에 마이그레이션 패키지가 필요합니다.
  2. INSTALLED_APPS .dict에 앱을 지정해야합니다 INSTALLED_APPS.
  3. 상세 실행하여 시작 makemigrations -v 3상세를 위해. 이로 인해 문제에 대한 정보를 얻을 수 있습니다.
  4. 전체 경로 에서 INSTALLED_APPS그것은 'apply.apps.MyAppConfig'전체 모듈 응용 프로그램의 설정 경로를 지정하는 것이 좋습니다
  5. - 설정 올바른 설정 파일이 설정되어 있는지 확인하십시오.manage.py makemigrations --settings mysite.settings
  6. 앱 이름을 명시 적으로 지정하여 앱 이름을 명시하십시오. 앱 manage.py makemigrations myapp의 마이그레이션 범위를 좁히고 문제를 격리하는 데 도움이됩니다.
  7. 모델 메타 확인 당신은 app_label당신의 모델 메타에 권리 가

  8. django 디버그 django 핵심 스크립트를 디버그하십시오. makemigrations 명령은 매우 간단합니다. pycharm에서 수행하는 방법은 다음과 같습니다 . 이에 따라 스크립트 정의를 변경 (예 : makemigrations --traceback myapp)

여러 데이터베이스 :

  • Db 라우터 django db 라우터로 작업 할 때, 라우터 클래스 (사용자 정의 라우터 클래스)는 allow_syncdb메소드 를 구현해야합니다 .

makemigrations는 항상 모델 변경에 대한 마이그레이션을 생성하지만 allow_migrate ()가 False를 반환하면,


1
문제에 관한 많은 시나리오를 다루었으므로 받아 들여 져야합니다.
Krishh 2016 년

또 다른 가능성 : 잘못된 이름을 가져 오는 중입니다 (예 : 필드 대신 양식에서 필드 가져 오기 또는 모델 대신 양식에서 모델 가져 오기). 예 : from recurrence.forms import RecurrenceField그러나이어야합니다 from recurrence.fields import RecurrenceField.
hlongmore

하나 더 이유. 모델이 웹 사이트의 경로 내에서 (관리자 또는 다른 방법을 통해) 사용되는지 확인하십시오. " makemigrations스크립트는 urls.py" 에서 연결된 모델을 찾습니다 . 여기 stackoverflow.com/questions/43093651/...
카일

cmd 예제 :python manage.py makemigrations -v 3 <app_name>
Charlie 木匠

테이블을 추가 한 다음이 새 테이블을 외래 키 참조를 동시에 추가하십시오. 사전 단계 : INSTALLED_APPS를 설정에 추가하십시오. 1) 새 테이블을 만듭니다 : python manage.py makemigrations <app_name>; 2) 외래 키 추가 : python manage.py makemigrations
Charlie 木匠

26

나는 종종 makemigrations다른 방법으로 단순히 실행된다는 내용 의이 질문에 대한 많은 답변을 읽었습니다 . 그러나 나에게 문제는 Meta모델 의 하위 클래스에 있었다.

label = <app name>( apps.py파일 옆 models.py, views.py등) 에 앱 구성이 있습니다. 메타 클래스에 앱 레이블과 동일한 레이블이없는 경우 (예 : 너무 큰 앱을 여러 개의 앱으로 분할하는 등) 변경 사항이 감지되지 않으며 유용한 오류 메시지가 표시되지 않습니다. 그래서 내 모델 수업에서 나는 지금 :

class ModelClassName(models.Model):

    class Meta:
        app_label = '<app name>' # <-- this label was wrong before.

    field_name = models.FloatField()
    ...

Django 1.10을 실행하십시오.


13

의견이지만 아마도 대답이되어야합니다.

앱 이름이 settings.py에 있는지 확인하십시오. INSTALLED_APPS그렇지 않으면 무엇을하든 마이그레이션이 실행되지 않습니다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

그런 다음 다음을 실행하십시오.

./manage.py makemigrations blog

'manage.py migrate'명령을 실행하면 테이블 이름이 'appname_modelname'으로 생성됩니다
Daniyal Javaid

테이블 이름을 변경하려면 모델 메타 옵션 을 참조하십시오
stephen

11

나는 여기에 설명되지 않은 또 다른 문제가있어서 나를 미치게했다.

class MyModel(models.Model):
    name = models.CharField(max_length=64, null=True)  # works
    language_code = models.CharField(max_length=2, default='en')  # works
    is_dumb = models.BooleanField(default=False),  # doesn't work

아마도 한 줄에 복사 및 붙여 넣기에서 ','가 있습니다. is_dumb가있는 행은 './manage.py makemigrations'를 사용하여 모델 마이그레이션을 작성하지 않았지만 오류가 발생하지 않았습니다. '를 제거한 후 예상대로 작동했습니다.

복사 & 붙여 넣기 할 때주의하십시오 :-)


후행 쉼표는 다른 곳에서도 버그를 일으킬 수 있습니다. 쉼표 때문에, 문 튜플 수 is_dumb와 동일한 (models.BooleanField(default=False), )하는 makemigrations데이터베이스 컬럼으로 변환하는 방법을 알고하지 않습니다.
hlongmore

8

앱 간의 특정 충돌을 처리 할 수 ​​있기 때문에 때로는 ./manage.py makemigrations우월한 경우 가 ./manage.py makemigrations <myapp>있습니다.

그러한 경우는 조용히 발생 swearing하며 두려운 No changes detected메시지 의 진정한 의미를 이해하는 데 몇 시간이 걸립니다 .

따라서 다음 명령을 사용하는 것이 훨씬 좋습니다.

./manage.py makemigrations <myapp1> <myapp2> ... <myappN>


7

django 외부에서 테이블을 복사했으며 메타 클래스의 기본값은 "managed = false"입니다. 예를 들면 다음과 같습니다.

class Rssemailsubscription(models.Model):
    id = models.CharField(primary_key=True, max_length=36)
    ...
    area = models.FloatField('Area (Sq. KM)', null=True)

    class Meta:
        managed = False
        db_table = 'RSSEmailSubscription'

manged를 True로 변경하면 마이그레이션이 변경 사항을 적용하기 시작했습니다.


4
  1. settings.py의 installed_apps에 앱이 언급되어 있는지 확인하십시오.
  2. 클래스 확장 모델을 모델링해야합니다.

2

나는 이것을함으로써 그 문제를 해결했다.

  1. "db.sqlite3"파일을 지우십시오. 여기서 문제 는 현재 데이터베이스가 지워 지므로 다시 만들어야한다는 것입니다.
  2. 편집 한 앱의 마이그레이션 폴더 내에서 마지막으로 업데이트 된 파일을 지 웁니다. 처음 생성 된 파일은 "0001_initial.py"입니다. 예를 들어 : 새 클래스를 만들어 "makemigrations"및 "migrate"프로 시저로 등록하면 "0002_auto_etc.py"라는 새 파일이 만들어졌습니다. 지우십시오.
  3. " pycache "폴더 (이주 폴더 내)로 이동하여 "0002_auto_etc.pyc"파일을 지우십시오.
  4. 마지막으로 콘솔로 이동하여 "python manage.py makemigrations"및 "python manage.py migrate"를 사용하십시오.

2

나는 올바른 주장을하는 것을 잊었다.

class LineInOffice(models.Model):   # here
    addressOfOffice = models.CharField("Корхоная жош",max_length= 200)   #and here
    ...

models.py에서 그런 성가신 것을 떨어 뜨 렸습니다.

앱 'myApp'에서 변경 사항이 감지되지 않았습니다.


2

또 다른 이유는 패키지에없는 다른 파일에 일부 모델이 정의되어 있고 다른 모델을 참조하지 않은 경우입니다.

나를 위해, 간단하게 추가 from .graph_model import *admin.py(여기서 graph_model.py문제 해결 새 파일이었다).


2

내 문제는 위의 답변보다 훨씬 간단하고 프로젝트가 이미 설정되어 작동하는 한 훨씬 일반적인 이유 일 수 있습니다. 오랫동안 사용되어 온 응용 프로그램 중 하나에서 마이그레이션이 불안정 해 보였으므로 서둘러 다음을 수행했습니다.

rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected

화 ??

실수로 모든 __init__.py파일을 실수로 제거했습니다. (-들어가고 나서 모든 것이 다시 작동했습니다.

touch ads1/migrations/__init__.py

내 각 응용 프로그램마다 makemigrations다시 작동했습니다.

내가 수동으로 서로를 복사하여 새 응용 프로그램을 생성하고 넣어 깜빡했다고 밝혀 __init__.pymigrations폴더와 그 모든 남았습니다 것을 저를 confinved - 내가와가 악화 최고의 rm -r전술 한 바와 같이.

이것이 누군가가 몇 시간 동안 "No changes detected"오류를 맹세하는 데 도움이되기를 바랍니다.


1

해결책은 INSTALLED_APPS에 앱을 포함시켜야한다는 것입니다.

나는 그것을 놓치고이 같은 문제를 발견했다.

내 앱 이름 마이그레이션을 지정한 후 성공

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'boards',
]

마지막으로 보드를 언급 했으므로 앱 이름입니다.


1

INSTALLED_APPS = [

'blog.apps.BlogConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

]

'blog.apps.BlogConfig'를 확인하십시오 (앱 마이그레이션을 위해 settings.py에 포함됨)

그런 다음 python3 manage.py makemigrations 블로그 또는 앱 이름을 실행하십시오.


1

매우 멍청한 문제는 class Meta모델에서 두 가지를 정의 하는 것입니다. 이 경우 첫 번째 변경 사항은 실행시 적용되지 않습니다 makemigrations.

class Product(models.Model):
    somefield = models.CharField(max_length=255)
    someotherfield = models.CharField(max_length=255)

    class Meta:
        indexes = [models.Index(fields=["somefield"], name="somefield_idx")]

    def somefunc(self):
        pass

    # Many lines...

    class Meta:
        indexes = [models.Index(fields=["someotherfield"], name="someotherfield_idx")]

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 하루 종일이 같은 문제로 싸웠으며 내 솔루션은 단순한 문제였습니다.

나는 디렉토리 구조를 따라 줄을 섰다.

apps/
   app/
      __init__.py
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

내가 다른 곳에서 가져 오기 결국 것을 수입되고 있었다에 문제가 있던 하나까지 모든 다른 모델까지 그리고 이후 main_app에 등록 된이 INSTALLED_APPS, 나는 단지 운이있어 그들은 모두 일했다.

나는 각을 추가하지만 이후 appINSTALLED_APPS와 있지 app_sub*마침내 다른 곳에서는 수입되지 않은 새로운 모델 파일을 추가 할 때, 장고 완전히 그것을 무시했습니다.

내 수정은 이와 같은 models.py기본 디렉토리에 파일을 추가하는 것이 었습니다 app...

apps/
   app/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

그런 다음 from apps.app.app_sub1 import *app레벨 models.py파일 에 등을 추가 하십시오.

Bleh ... 이걸 알아내는 데 너무 오래 걸렸고 솔루션을 찾을 수 없었습니다 ... Google 결과의 2 페이지로 이동했습니다.

이것이 누군가를 돕기를 바랍니다!


1

공식 문서의 마이그레이션 섹션에 따르면 django 3.0과 비슷한 문제가 발생하여 테이블 구조를 업데이트하기에 충분했습니다.

python manage.py makemigrations
python manage.py migrate

그러나 출력은 항상 동일했습니다. 'makemigrations'스크립트를 실행 한 후 모델에 대한 '변경이 감지되지 않았습니다'. db에서 업데이트하려는 모델의 models.py에서 구문 오류가 발생했습니다.

field_model : models.CharField(max_length=255, ...)

대신에:

field_model = models.CharField(max_length=255, ...)

이러한 어리석은 실수를 해결하고 문제없이 마이그레이션을 수행했습니다. 아마도 이것은 누군가를 도울 것입니다.



0

제 경우에는 클래스 인수를 삽입하는 것을 잊었습니다.

잘못된:

class AccountInformation():

옳은

class AccountInformation(models.Model):

0

필자의 경우 먼저 모델에 필드를 추가했으며 Django는 변경 사항이 없다고 말했습니다.

모델의 "테이블 이름"을 변경하기로 결정한 것보다 마이그레이션이 효과적이었습니다. 테이블 이름을 기본값으로 다시 변경하고 새 필드도있었습니다.

장고 마이그레이션 시스템에는 "버그"가 있으며 때로는 새로운 필드가 보이지 않습니다. 날짜 필드와 관련이있을 수 있습니다.


0

가능한 이유는 기존 db 파일 및 마이그레이션 폴더를 삭제했기 때문일 수 있습니다 manage.py makemigrations <app_name>. 파이썬을 사용할 수 있습니다 . 나는 한 번 비슷한 문제에 직면했다.


0

또 하나의 엣지 케이스와 솔루션 :

부울 필드를 추가하고 동시에 동일한 이름 (doh)으로 @property를 참조하는 @property를 추가했습니다. 속성을 주석 처리하면 마이그레이션에서 새 필드를보고 추가합니다. 재산의 이름을 바꾸었고 모두 좋습니다.


0

당신이있는 경우 managed = True이 행해져 Yout 모델 메타에, 당신은 그것을 제거하고 마이그레이션을 할 필요가있다. 그런 다음 마이그레이션을 다시 실행하면 새 업데이트가 감지됩니다.


0

django api 애플리케이션에 새 모델을 추가 python manage.py makemigrations하고 도구를 실행할 때 새 모델이 감지되지 않았습니다.

이상한 점은 이전 모델이에 의해 선택되었다는 것이 었 makemigrations습니다.urlpatterns 체인 도구가 어떻게 든 감지 입니다. 따라서 그 행동을 주시하십시오.

모델 패키지에 해당하는 디렉토리 구조에 서브 패키지가 있고 모든 __init__.py파일이 비어 있기 때문에 문제가 발생했습니다 . 각 하위 폴더와 __init__.py Django 모델에서 필요한 클래스를 모두 가져와야 도구로 가져올 수 있습니다 makemigrations.

models
  ├── __init__.py          <--- empty
  ├── patient
     ├── __init__.py      <--- empty
     ├── breed.py
     └── ...
  ├── timeline
     ├── __init__.py      <-- empty
     ├── event.py
     └── ...

0

admin.py에 모델을 등록하십시오. 예는 다음과 같습니다 .- admin.site.register (YourModelHere)

다음 작업을 수행 할 수 있습니다 .- 1. admin.site.register (YourModelHere) # admin.py에서 2. 페이지를 다시로드하고 다시 시도하십시오. 3. CTRL-S를 누르고 저장하십시오. 4. 오류가있을 수 있습니다. 특히 모델을 확인하십시오. .py 및 admin.py 5. 또는 모든 것이 끝나면 서버를 다시 시작하십시오.


0

내가 이것을 쫓아 내려는 데 몇 시간을 소비했기 때문에 이것은 다른 누군가를 도울 수 있습니다.

모델 내에 같은 이름 으로 함수가 있으면 값이 제거됩니다. 가늠자에게는 꽤 분명하지만 그럼에도 불구하고.

따라서 다음과 같은 것이 있다면

class Foobar(models.Model):
    [...]
    something = models.BooleanField(default=False)

    [...]
    def something(self):
        return [some logic]

이 경우이 기능은 위의 설정을 무시하여 "보이지 않음"으로 설정합니다 makemigrations.


0

최선의 방법은 기존 데이터베이스를 삭제하는 것입니다. 필자의 경우 phpMyAdmin SQL 데이터베이스를 사용하고 있었으므로 생성 된 데이터베이스를 수동으로 삭제합니다.

삭제 후 : PhpMyAdmin에서 데이터베이스를 작성하고 테이블을 추가하지 않습니다.

다음 명령을 다시 실행하십시오.

python manage.py makemigrations

python manage.py migrate

이 명령 후 : django가 데이터베이스에 다른 필요한 테이블을 자동으로 생성 한 것을 볼 수 있습니다 (약 10 개의 테이블이 있음).

python manage.py makemigrations <app_name>

python manage.py migrate

그리고 마지막으로 : 위의 명령 후에 생성 한 모든 모델 (테이블)을 데이터베이스로 직접 가져옵니다.

이것이 도움이되기를 바랍니다.


0

이 오류에 대한 내 문제는 내가 포함했다는 것입니다.

class Meta:
   abstract = True

만들고 싶은 내부 모델이 마이그레이션되었습니다.


0

이라는 새 앱을 만드는 동안 다른 문제가 발생했습니다 deals. 나는 이름이 개 모델 파일을했다, 그래서 나는 그 응용 프로그램 내부의 모델을 분리하고 싶어 deals.py하고 dealers.py. 실행할 때 python manage.py makemigrations내가 가지고 : No changes detected.

나는 __init__.py내 모델 파일이 살고있는 디렉토리 (거래 및 딜러)와 같은 디렉토리에있는 내부로 들어갔다.

from .deals import *
from .dealers import *

그리고 makemigrations명령이 작동했습니다.

어디서나 모델을 가져 오지 않거나 모델 파일 이름이 없으면 models.py모델이 감지 되지 않습니다 .

나에게 일어난 또 다른 문제는 내가 앱을 작성한 방식입니다 settings.py.

나는했다 :

apps.deals

루트 프로젝트 폴더가 포함되어 있어야합니다.

cars.apps.deals
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.