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__.py에 migrations폴더와 그 모든 남았습니다 것을 저를 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, 나는 단지 운이있어 그들은 모두 일했다.

나는 각을 추가하지만 이후 app에 INSTALLED_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.