Django - makemigrations - Hiçbir değişiklik tespit edilmedi


141

Makemigrations komutunu kullanarak mevcut bir uygulama içinde geçişler oluşturmaya çalışıyordum, ancak "Hiçbir değişiklik algılanmadı" sonucunu veriyor.

Genellikle startappkomutu kullanarak yeni uygulamalar oluşturuyorum ancak oluşturduğumda bu uygulama için kullanmadım.

Hata ayıkladıktan sonra, migrationspaket / klasör bir uygulamada eksik olduğu için taşıma oluşturmadığını öğrendim .

Klasörü orada yoksa oluştursa daha mı iyi olur yoksa bir şey eksik mi?


13
Uygulamanızı INSTALLED_APPS uygulamasına eklediniz mi?
wolendranh

6
Evet, yüklü uygulamada, makemigrations <myapp>Alasdair'in de belirttiği gibi ilk kez kullanılması daha iyi .
Dilraj

1
Kaldır 'abstract = True' :)
GrvTyagi

'makemigrations' işe yaramadı. 'makemigrations <myapp>' çalıştı
Aseem

Benim durumumda, models.py içindeki sınıflar models.Model'den miras almadığı için değişiklikler tespit edilmedi. Models.py içerisindeki sınıfların models.Model'den miras alınmasını sağladıktan sonra, örneğin MyDataClass (models.Model) problem çözüldü. Önemsiz, ama umarım bu birine yardımcı olabilir.
LMB

Yanıtlar:


268

Bir uygulama için ilk geçişleri oluşturmak üzere, çalıştırın makemigrationsve uygulama adını belirtin. Geçişler klasörü oluşturulacaktır.

./manage.py makemigrations <myapp>

INSTALLED_APPSÖncelikle uygulamanız dahil edilmelidir (settings.py içinde).


15
Neden <bazen> bizi uygulamayı belirtmeye zorladıkları hakkında bir fikriniz var mı?
maazza

40
@maazza, uygulamanın migrationsklasörü yoksa uygulama adını belirtmeniz gerekir . Bu, uygulamayı manuel olarak oluşturduysanız veya Django'nun geçişleri olmayan eski bir sürümünden yükselttiyseniz olabilir.
Alasdair

13
@maazza Aslında __init__.pyuygulamada 'geçişler' adlı bir python paketine ihtiyacınız var .
Jibin

3
Django'nun otomatik olarak halletmesi gereken bir şeye benziyor.
duality_

1
@duality_ bu tasarım gereğidir - Django, uygulamanız için geçişler istediğinizi varsaymaz. Tüm uygulamalar için geçişler oluşturduysa, çalıştırdığınızda hatalara neden olabilir migrate.
Alasdair

50

Benim sorunum (ve dolayısıyla çözüm) yukarıda açıklananlardan henüz farklıydı.

models.pyDosya kullanmıyordum , ancak bir modelsdizin oluşturdum ve my_model.pyorada modelimi koyduğum dosyayı yarattım . Django modelimi bulamadı, bu yüzden uygulanacak geçiş olmadığını yazdı.

Benim çözümüm şuydu: my_app/models/__init__.pydosyaya bu satırı ekledim: from .my_model import MyModel


Bu benim için de bir çözüm oldu, ama bunun neden olduğunu anlamıyorum. Buna neyin sebep olabileceğine dair bir fikri olan var mı?
Paul in 't Hout

Django, modellerinizi aramak için varsayılan bir yola sahiptir. Proje yapısı farklıysa ve modeller olağan yerde değilse oraya ithal edilmeleri gerekir.
Karina Klinkevičiūtė

@ KarinaKlinkevičiūtė ya bu tür modelleri kaldırmam gerekirse?
Daniil Mashkin

@DaniilMashkin İthalatı da kaldırmanız gerektiğini düşünüyorum. Bu, projenizi yapılandırmanın yollarından biridir (tek değil) ve seçerseniz onunla birlikte gelen ek görevlerle
uğraşmanız

1
Modeller için "klasik" mimariyi kullandım, ardından "modeller klasörü" mimarisine geçtim ve mevcut modellerimde herhangi bir geçiş hala algılanıyor. Ancak şimdi yeni bir model oluştururken bu sorunu yaşıyorum. Çözümünüz iyi çalışıyor, ancak kod tabanımın tutarsız olmasına izin veriyor çünkü bazen bir içe aktarma var, bazen değil. Belki daha iyi bir çözüm vardır. Sanırım Django, yeni modeller bulmaya çalışırken bakılacak klasörlerin bir listesini içeren bir ayar önermeli.
David D.

44

Django'nun makemigrationskomut sırasında nelerin taşınacağını algılamamasının birçok olası nedeni vardır .

  1. taşıma klasörü Uygulamanızda bir taşıma paketine ihtiyacınız var.
  2. INSTALLED_APPS Uygulamanızın INSTALLED_APPS.dict'te belirtilmesi gerekir
  3. Ayrıntımakemigrations -v 3 , ayrıntı için çalıştırarak başlar . Bu, soruna biraz ışık tutabilir.
  4. Tam yolu ise INSTALLED_APPSona 'apply.apps.MyAppConfig' Tam modül uygulaması Yapılandırma yolu belirtmek için tavsiye edilir
  5. - ayarlar, doğru ayarlar dosyasının ayarlandığından emin olmak isteyebileceğiniz ayarlar:manage.py makemigrations --settings mysite.settings
  6. uygulama adını belirtin, uygulama adını açıkça manage.py makemigrations myappekleyin - bu, yalnızca uygulama için geçişleri daraltır ve sorunu yalıtmanıza yardımcı olur.
  7. modeli meta Eğer hakkına sahip kontrol app_labelmodeliniz meta

  8. Django hata ayıklama django çekirdek komut dosyası. makemigrations komutu oldukça basittir. İşte pycharm'da nasıl yapılacağı . buna göre komut tanımını değiştirin (örn: makemigrations --traceback myapp)

Çoklu veritabanları:

  • Db Router , django db router ile çalışırken, router sınıfının (sizin özel router sınıfınız) allow_syncdbmetodu uygulaması gerekir .

makemigrations her zaman model değişiklikleri için geçişler oluşturur, ancak allow_migrate () False değerini döndürürse,


1
Sorunla ilgili birçok senaryoyu kapsayan, kabul edilen cevap olmalıdır.
Krishh

Başka bir olasılık: Yanlış ad içe aktarılıyor, yani alanlar yerine formlardan bir alanı içe aktarmak veya modeller yerine formlardan bir modeli içe aktarmak. Bir örnek: from recurrence.forms import RecurrenceFieldama olmalıydı from recurrence.fields import RecurrenceField.
hlongmore

Bir neden daha. Modelin web sitesi için bir yol dahilinde kullanıldığından emin olun (yönetici aracılığıyla veya başka bir şekilde). " makemigrationsKomut dosyası, bağlı olan modelleri arar urls.py". Burada stackoverflow.com/questions/43093651/…
Kyle,

cmd örneği:python manage.py makemigrations -v 3 <app_name>
Charlie 木匠

Bir tablo eklediğimde ve ardından bu yeni tabloya aynı anda bir Yabancı Anahtar referansı eklediğimde. 2 adıma bölünmelidir: ön adım: ayarlara INSTALLED_APPS ekleyin. 1) yeni tablo oluşturun: python manage.py makemigrations <uygulama_adı>; 2) Yabancı Anahtar ekleyin: python manage.py makemigrations
Charlie 木匠

26

Bu soruya çoğu kez basitçe makemigrationsbaşka şekillerde koşmak gerektiğini belirten birçok yanıt okudum . Ama bana göre sorun Metamodellerin alt sınıfındaydı.

Ben diyor bir uygulama yapılandırma var label = <app name>(içinde apps.pyyanında, dosyanın models.py, views.pyvs). Herhangi bir şans eseri meta sınıfınız uygulama etiketiyle aynı etikete sahip değilse (örneğin, çok büyük bir uygulamayı birden çok uygulamaya böldüğünüz için), hiçbir değişiklik algılanmaz (ve herhangi bir yardımcı hata mesajı yoktur). Yani model sınıfımda şimdi var:

class ModelClassName(models.Model):

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

    field_name = models.FloatField()
    ...

Django 1.10 burada çalıştırılıyor.


13

Bu bir yorum ama muhtemelen bir cevap olmalı.

Uygulamanızın adının settings.py içinde olduğundan emin olun, INSTALLED_APPSaksi takdirde ne yaparsanız yapın taşıma işlemleri çalıştırmaz.

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

    'blog',
]

O zaman koş:

./manage.py makemigrations blog

ancak 'manage.py migrate' komutunu çalıştırdığımızda tablo adını 'appname_modelname' olarak oluşturur
Daniyal Javaid

Tablo adını değiştirmek için model meta seçeneklerine bakın
stephen

11

Burada anlatılmayan başka bir problemim vardı, bu da beni çılgına çevirdi.

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

Muhtemelen kopyala ve yapıştır satırında bir satırda '' vardı. İs_dumb ile satır './manage.py makemigrations' ile bir model geçişi oluşturmadı, ancak bir hata da vermedi. "" Öğesini kaldırdıktan sonra beklendiği gibi çalıştı.

Bu yüzden kopyalayıp yapıştırırken dikkatli olun :-)


Sondaki virgül başka yerlerde de hatalara neden olabilir; virgül, yani deyim tuple yapan is_dumbeşittir (models.BooleanField(default=False), )hangi makemigrationsbir veri tabanı sütuna dönüştürme bilmiyor.
hlongmore

8

Bazen uygulamalar arasındaki belirli çatışmaları ./manage.py makemigrationsçözebildiği için üstün olduğu zamanlar vardır ./manage.py makemigrations <myapp>.

Bu durumlar sessizce gerçekleşir ve swearingkorkunç No changes detectedmesajın gerçek anlamını anlamak birkaç saat sürer .

Bu nedenle, aşağıdaki komutu kullanmak çok daha iyi bir seçimdir:

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


7

Django'nun dışından bir tablo kopyalamıştım ve Meta sınıfı varsayılan olarak "managed = false" olarak ayarlandı. Örneğin:

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'

Düzenlemeyi True olarak değiştirerek, makemigrasyonlar değişiklikleri toplamaya başladı.


4
  1. Ayarlar.py'deki install_apps uygulamasında uygulamanızdan bahsedildiğinden emin olun.
  2. Model sınıfının modelleri genişlettiğinden emin olun.

2

Bunu yaparak bu sorunu çözdüm:

  1. "Db.sqlite3" dosyasını silin. Buradaki sorun şu ki, mevcut veri tabanınız silinecek, bu yüzden onu yeniden oluşturmanız gerekecek.
  2. Düzenlenen uygulamanızın geçişler klasörünün içinde, son güncellenen dosyayı silin. İlk oluşturulan dosyanın "0001_initial.py" olduğunu unutmayın. Örneğin: Yeni bir sınıf oluşturdum ve bunu "makemigrations" ve "migrate" prosedürü ile kaydettirdim, şimdi "0002_auto_etc.py" adlı yeni bir dosya oluşturuldu; Sil bunu.
  3. " Pycache " klasörüne gidin (geçişler klasörünün içinde) ve "0002_auto_etc.pyc" dosyasını silin.
  4. Son olarak, konsola gidin ve "python manage.py makemigrations" ve "python manage.py migrate" komutlarını kullanın.

2

Doğru argümanlar koymayı unuttum:

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

models.py ve sonra o sinir bozucu

'MyApp' uygulamasında hiçbir değişiklik tespit edilmedi


2

Başka bir olası neden, başka bir dosyada (bir pakette değil) tanımlanmış bazı modellere sahip olmanız ve başka hiçbir yerde buna başvurmamış olmanızdır.

Benim için, basit toplama from .graph_model import *için admin.py(burada graph_model.pysorunun giderilmiş yeni bir dosya idi).


2

Benim problemim yukarıdaki cevaplardan çok daha basitti ve muhtemelen projeniz zaten kurulmuş ve çalışıyor olduğu sürece çok daha yaygın bir nedendi. Uzun süredir çalışan uygulamalarımdan birinde geçişler riskli görünüyordu, bu yüzden acelemle şunları yaptım:

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

Whaat ??

Yanlışlıkla tüm __init__.pydosyaları da sildim :( - İçeri girdikten sonra her şey tekrar çalışıyordu ve:

touch ads1/migrations/__init__.py

Uygulamalarımın her biri için makemigrationstekrar çalıştı.

Bir başkasını kopyalayarak manuel olarak yeni bir uygulama oluşturduğum __init__.pyve migrationsklasöre koymayı unuttuğum ve bu beni her şeyin riskli olduğu konusunda sınırlandırdı - bu da beni birrm -r yukarıda açıklandığı gibi işleri .

Umarım bu, birisinin birkaç saat boyunca "Değişiklik tespit edilmedi" hatasını almasına yardımcı olur.


1

Çözüm, uygulamanızı INSTALLED_APPS içine dahil etmeniz gerektiğidir.

Özledim ve aynı sorunu buldum.

uygulama adımı belirttikten sonra geçiş başarılı oldu

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

Lütfen en son olarak panolardan bahsettiğimi unutmayın, bu benim uygulama adımdır.


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' olduğundan emin olun (bu, uygulama geçişlerinizi yapmak için settings.py dosyanıza dahil edilmiştir)

ardından python3 manage.py makemigrations blogunu veya uygulamanızın adını çalıştırın


1

Sahip olabileceğiniz çok aptalca bir konu da class Metamodelinizde iki tane tanımlamaktır . Bu durumda, ilkinde yapılan herhangi bir değişiklik çalışırken uygulanmaz 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

Bunun eski bir soru olduğunu biliyorum ama bütün gün aynı sorunla mücadele ettim ve çözümüm basitti.

Dizin yapıma şu satırlarda bir şeyler yaptırdım ...

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

Ve benim sorun yaşadığım modele kadar diğer tüm modeller, başka bir yere ithal ediliyordu ve main_appbu da kayıtlı olduğu ithalatla sonuçlandığından INSTALLED_APPS, hepsinin çalıştığı için şanslı oldum.

Ancak her appbirini , başka HİÇBİR YERDE içe aktarılmamış yeni bir modeller dosyası eklediğimde INSTALLED_APPSdeğil, yalnızca eklediğim için app_sub*, Django onu tamamen görmezden geldi.

Düzeltmem, models.pyher birinin temel dizinine appbunun gibi bir dosya eklemekti ...

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

ve sonra seviye dosyalarının from apps.app.app_sub1 import *her birine vb. ekleyin .appmodels.py

Bleh ... Bunu anlamam ÇOK uzun sürdü ve çözümü hiçbir yerde bulamadım ... Hatta google sonuçlarının 2. sayfasına bile gittim.

Umarım bu birine yardımcı olur!


1

Bir uç durum ve çözüm daha:

Bir boole alanı ekledim ve aynı zamanda aynı ada (doh) sahip bir @ özelliği referans alarak ekledim. Mülkiyet ve göçü yorumluyor ve yeni alanı görüyor ve ekliyor. Mülkün adını değiştirdi ve her şey yolunda.


1

Resmi belgelerdeki geçişler bölümüne göre django 3.0 ile benzer bir sorun yaşadım , bunu çalıştırmak tablo yapımı güncellemek için yeterliydi:

python manage.py makemigrations
python manage.py migrate

Ancak çıktı her zaman aynıydı: 'makemigrations' komut dosyasını çalıştırdıktan sonra modellerim hakkında 'hiçbir değişiklik algılanmadı'. Db'de güncellemek istediğim modelde models.py'de bir sözdizimi hatası aldım:

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

onun yerine:

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

Bu aptalca hatayı çözmek, o komuta ile göç sorunsuz bir şekilde gerçekleştirildi. Belki bu birine yardımcı olur.


0

Sen eklemek gerekir polls.apps.PollsConfigiçin INSTALLED_APPSdesetting.py


0

Benim durumumda sınıf argümanlarını eklemeyi unuttum

Yanlış:

class AccountInformation():

Doğru

class AccountInformation(models.Model):

0

Benim durumumda, önce modele bir alan ekledim ve Django hiçbir değişiklik olmadığını söyledi.

Modelin "tablo adını" değiştirmeye karar verdikten sonra, düzenlemeler işe yaradı. Daha sonra tablo adını varsayılan olarak değiştirdim ve yeni alan da oradaydı.

Django göç sisteminde bir "bug" var, bazen yeni alanı görmüyor. Tarih alanıyla ilişkili olabilir.


0

Olası neden, var olan db dosyasının silinmesi ve python kullanabileceğiniz geçiş klasörünün manage.py makemigrations <app_name>çalışması olabilir. Bir zamanlar benzer bir sorunla karşılaştım.


0

Eğer varsa managed = Trueyout modelinde Meta içinde, bunu kaldırmak ve Taşımayı yapmak gerekir. Daha sonra taşıma işlemlerini tekrar çalıştırın, yeni güncellemeleri algılar.


0

Django api uygulamasına yeni modeller eklerken ve python manage.py makemigrations ve aracı herhangi bir yeni model algılamadı.

Garip olan şey, eski modellerin seçilmesiydi makemigrations, ancak bunun nedeni, urlpatternszincirde referans verilmiş olmaları ve aracın onları bir şekilde algılamasıydı. Öyleyse bu davranışa bir göz atın.

Sorun, model paketine karşılık gelen dizin yapısının alt paketlere sahip olması ve tüm __init__.py dosyaların boş . Django'nun araçla alması için her alt klasördeki ve modellerdeki gerekli tüm sınıfları açıkça içe aktarmaları gerekir .__init__.pymakemigrations

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

0

Modelinizi admin.py'ye kaydetmeyi deneyin, işte bir örnek: - admin.site.register (YourModelHere)

Aşağıdakileri yapabilirsiniz: - 1. admin.site.register (YourModelHere) # In admin.py 2. Sayfayı yeniden yükleyin ve tekrar deneyin 3. CTRL-S'ye basın ve kaydedin 4. Bir hata olabilir, modelleri özellikle kontrol edin .py ve admin.py 5. Veya, hepsinin sonunda sunucuyu yeniden başlatın


0

Bunun peşinden gitmek için saatler harcadığım için, umarım bir başkasına yardımcı olabilir.

Eğer bir işleve sahip olan aynı isimle modeliniz, bu değeri kaldıracaktır. Geriye dönüp bakıldığında oldukça açık, ama yine de.

Öyleyse, böyle bir şeye sahipseniz:

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

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

Bu durumda, işlev yukarıdaki ayarı geçersiz kılarak onu "görünmez" hale getirecektir makemigrations.


0

Yapabileceğiniz En İyi Şey, mevcut veritabanını silmek. Benim durumumda phpMyAdmin SQL veritabanını kullanıyordum, bu yüzden oluşturulan veritabanını oradan elle siliyorum.

Sildikten Sonra: PhpMyAdmin'de veritabanı oluşturuyorum ve herhangi bir tablo eklemiyorum.

Aşağıdaki Komutları tekrar çalıştırın:

python manage.py makemigrations

python manage.py migrate

Bu Komutlardan Sonra : django'nun Veritabanında diğer gerekli tabloları otomatik olarak oluşturduğunu görebilirsiniz (Yaklaşık 10 tablo vardır).

python manage.py makemigrations <app_name>

python manage.py migrate

Ve Son olarak: Yukarıdaki komutlardan sonra, oluşturduğunuz tüm model (tablo) doğrudan veritabanına aktarılır.

Umarım bu yardımcı olur.


0

Bu hatayla ilgili sorunum şuydu:

class Meta:
   abstract = True

Oluşturmak istediğim iç model göç etmek.


0

Adlı yeni bir uygulama oluştururken farklı bir sorunla karşılaştım deals. Bu uygulamanın içindeki modelleri ayırmak istedim, böylece deals.pyve adlı 2 model dosyam vardı dealers.py. Çalıştırırken python manage.py makemigrationsI got: No changes detected.

Devam ettim ve __init__.pymodel dosyalarımın yaşadığı aynı dizinde yaşayan içinde (anlaşmalar ve bayi) yaptım

from .deals import *
from .dealers import *

Ve sonra makemigrations komut çalıştı.

Modelleri herhangi bir yere içe aktarmıyorsanız VEYA modeller dosya adınızın models.py modeller algılanmayacaktır.

Başıma gelen bir diğer sorun da uygulamayı yazma şeklim settings.py :

Sahiptim:

apps.deals

Kök proje klasörünü içermesi gerekirdi:

cars.apps.deals
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.