Django 1.7 - Değişiklikleri tespit etmeyen değişiklikler


140

Başlığın dediği gibi, göçlerin çalışmasını sağlayamıyorum.

Uygulama başlangıçta 1.6'nın altındaydı, bu yüzden göçlerin başlangıçta orada olmayacağını anlıyorum ve gerçekten çalıştırırsam python manage.py migrate:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

Eğer herhangi bir modelde değişiklik yaparsam myapp, yine de beklendiği gibi taşınmamış diyor.

Ama eğer python manage.py makemigrations myappkoşarsam:

No changes detected in app 'myapp'

Komutu ne veya nasıl çalıştırdığım önemli değil, uygulamayı hiçbir zaman değişiklik olarak algılamıyor veya uygulamaya herhangi bir geçiş dosyası eklemiyor.

Bir uygulamayı taşıma işlemlerine zorlamanın ve "Bu benim çalışmak için temelim" veya başka bir şey söylemenin bir yolu var mı? Yoksa bir şey mi kaçırıyorum?

Veritabanım PostgreSQL veritabanıdır.


Sunulan çözümler benim için işe yaramadı, bu yüzden aynı sorunla karşılaşan benim çözümüm! 1. Tüm uygulamaların altındaki taşıma dosyalarını silin 2. Veritabanını silin ve yeniden oluşturun 3. makemigrations'ı çalıştırın ve komutları taşıyın PS İlk olarak 1. ve 3. adımları deneyin. Hala bir hata varsa 1-3 arası adımları uygulayın.
Amoroso

Yanıtlar:


187

Django 1.6'da yaptığınız mevcut bir uygulamadan geçiş yapıyorsanız, belgelerde listelenen bir adım öncesi (öğrendiğim gibi) yapmanız gerekir:

python manage.py makemigrations your_app_label

Belgeler, uygulama etiketini komuta eklemeniz gerektiğini açıkça göstermez, çünkü size söyleyeceği ilk şey python manage.py makemigrationsbaşarısız olacaktır. İlk taşıma, uygulamanızı 1.7 sürümünde oluşturduğunuzda yapılır, ancak 1.6'dan gelirseniz gerçekleştirilmezdi. Daha fazla ayrıntı için belgelerdeki 'Uygulamalara taşıma ekleme' konusuna bakın .


1
Django 1.6'dan gelen insanlar için güzel bir cevap! Teşekkürler!
David D.

1
Birden fazla uygulamam varsa ne olur? python manage.py makemigrations APP_LABELHer biri için mi yapmalıyım ?
Alston

1
Burada Django 1.9 altında ve benim app ile oluşturuldu ./manage.py startapp, ama yine de açıkça etiketten bahsetmek zorunda kaldı
maxbellec

50

Bu, aşağıdaki nedenlerden dolayı olabilir:

  1. Uygulamayı içindeki INSTALLED_APPSlisteye eklemediniz settings.py ( Kullandığınız django sürümüne bağlı olarak, uygulama klasöründeki apps.py'deki AppConfig alt sınıfına uygulama adını veya noktalı yolu eklemeniz gerekir ). Belgelere bakın: INSTALLED_APPS
  2. Bu migrationsuygulamaların içinde klasörünüz yok . (Çözüm: sadece bu klasörü oluşturun).
  3. Bu uygulamaların klasöründe __init__.pydosya yok migrations. (Çözüm: __init__.py adında boş bir dosya oluşturun. )
  4. __init__.pyUygulama klasörü içinde bir dosyanız yok . (Çözüm: __init__.py adında boş bir dosya oluşturun. )
  5. models.pyUygulamada bir dosyanız yok
  6. İçindeki Python sınıfınız (model olması gerekiyordu) models.pymiras almıyordjango.db.models.Model
  7. İçindeki modellerin tanımında bazı anlamsal hatalarınız var models.py

Not: Yaygın bir hata dosyaya migrationsklasör eklemektir .gitignore. Uzak depodan klonlandığında, yerel depoda migrationsklasör ve / veya __init__.pydosyalar eksik olacaktır. Bu soruna neden olur.

Ben aşağıdaki satırları ekleyerek geçiş dosyalarını gitignore önermek .gitignoredosyanın

*/migrations/*
!*/migrations/__init__.py

1
Projemi klonladım ve taşıma klasörü repoya aktarılmadı, bu yüzden taşıma direktörü eklemek zorunda kaldım, sonra init .py'yi ekledim ve taşıma yapabildim. Teşekkür ederim
Junaid

Henüz dağıtmadığım bir projedeki şeyleri "sıfırlamak" için / migrations klasörümün içeriğini sildim. Taşıma işlemleri __init__.pyile birlikte klasörü yanlışlıkla sildim .
Seth

Bu benim için yaptı .... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py).. ve neden dosyaları ekledi.gitignore
lukik

1
Neden init .py dosyası göçler klasöründe kadar önemli? Bu mantık için nerede daha derine inebilirim?
Nimish Bansal

1
@NimishBansal __init__.pyPython paketi olarak işlem görmesi için bir dizin içinde python 3.3 dosyası gerekir. bunu gör
Mohammed Shareef C

29

Tamam, bariz bir adımı kaçırmışım gibi görünüyor, ancak başkalarının da aynı şeyi yapması durumunda bunu gönderiyoruz.

1.7 sürümüne yükseldiğimde, modellerim yönetilmedi ( managed = False) - Onları daha Trueönce olduğu gibi aldım ama geri döndü.

Bu satırı kaldırarak (Varsayılan olarak True seçeneğine) ve ardından makemigrationshemen çalıştırma geçiş modülü yaptı ve şimdi çalışıyor. makemigrationsyönetilmeyen tablolarda çalışmaz (Bu, arkada açıktır)


4
Lütfen açıklığa kavuşturun - "yönetilen = Yanlış" ifadesini nerede değiştirdiniz / eklediniz? Aynı sorunu yaşıyorum
Ycon

1
Artık bu kodu yok, ama doğru hatırlıyorsam sınıfın bir özellik olarak düşünüyorum.
TyrantWave

1
İyi bir nokta. Not manage.py inspectdbyönetmek ekler = False! eski veritabanlarını içe aktarmanız durumunda dikkatli bir şekilde ayarlamanız gerekir!
Alessandro Dentella

@TyrantWave, günümü kurtardın. Çok teşekkürler.
Utkarsh Sharma

app_labelaynı olduğundan emin olun
Luv33preet

19

Çözümüm burada ele alınmadı, bu yüzden gönderiyorum. syncdbBir proje için kullanıyordum - sadece işe koyulup çalıştırmak için. Sonra Django taşımalarını kullanmaya çalıştığımda, önce onları taklit etti ve sonra 'Tamam' olduğunu söyleyecekti ama veritabanına hiçbir şey olmadı.

Benim çözümüm sadece benim uygulamasında tüm göç dosyaları silmek, oldu yanı sıra içinde uygulama taşıma işlemlerinde veritabanı kayıtları django_migrationsmasaya.

Sonra sadece bir ilk geçiş yaptım:

./manage.py makemigrations my_app

bunu takiben:

./manage.py migrate my_app

Artık sorunsuz geçişler yapabilirim.


Bilginize: Burada, "dosyaların yanı sıra veritabanı kayıtlarını" belirtmesi çok önemlidir . Veritabanı kayıtlarını kaldırır ancak dosyaları da kaldırmazsanız (hariç __init.py__, çalışmaz.
Mike Robinson

15

@Furins ile aynı fikirde. Her şey yolunda görünüyorsa ve yine de bu sorun ortaya çıkıyorsa, Model sınıfında eklemeye çalıştığınız öznitelikle aynı başlığa sahip herhangi bir özellik yöntemi olup olmadığına bakın.

  1. Eklediğiniz özniteliğe benzer ada sahip yöntemi kaldırın.
  2. manage.py makemigrations my_app
  3. manage.py taşıma uygulamamı taşı
  4. Yöntemleri geri ekleyin.

11

Bu biraz aptalca bir hatadır, ancak model sınıfındaki alan bildirimi satırının sonunda fazladan bir virgül bulunması, çizginin bir etkisi olmaz.

Def kopyasını yapıştırdığınızda olur. kendisi bir dizi olarak tanımlanan geçişten.

Belki bu birine yardımcı olur :-)


1
Yorumunuz sorunumu bulmama yardımcı oldu! Seçimler listesinde son seçim sonunda virgül yoktu ... açıkça Django çok hassas.
Maxim

1
@Maxim: sorununuzun nedeni bu değildi: sonunda virgül içermeyen bir liste hala bir listedir. Başka bir konu tuples: bir demette sadece 1 element varsa, ondan sonra virgül gerekir.
16:44

dostum beni çok zamandan kurtardı! @dangonfast: Model tanımında bu gerçekten bir sorundur.
MrE

11

Belki çok geç kaldım ama migrationsuygulamanızda içinde bir __init__.pydosya bulunan bir klasör var mı?


1
Bu "makemigrations" varsa uygulama için taşıma oluşturur. Aksi takdirde (bu dosyayı oluşturan) app_adı makemigrations çalıştırmanızı gerektirir
Scott Warren

7

Belki bu birisine yardım eder. Yuvalanmış bir uygulama kullanıyordum. project.appname ve aslında INSTALLED_APPS içinde project ve project.appname vardı. Projenin INSTALLED_APPS kaynağından kaldırılması değişikliklerin algılanmasına izin verdi.


7

Cevap, bu yığın akışı yazısında, cdvv7788 tarafından Django 1.7'deki göçler

Bu uygulamayı ilk kez taşıyorsanız kullanmanız gerekir:

manage.py makemigrations myappname Bunu yaptıktan sonra şunları yapabilirsiniz:

manage.py migra Uygulamanız veritabanında olsaydı, modelinde değişiklik yaptı ve muhtemelen taşınmamış olduğunuz değişikliklere ilişkin değişiklikleri güncellemiyordu. Modelinizi orijinal biçimine geri döndürün, ilk komutu (uygulama adıyla) çalıştırın ve taşıyın ... sahte olacak. Bunu yaptıktan sonra, modelinizdeki değişiklikleri geri koyun, makgragrasyonları çalıştırın ve tekrar taşıyın ve işe yarayacak.

Aynı sorunu yaşıyordum ve yukarıdakileri yapmak mükemmel çalıştı.

Django uygulamamı cloud9'a taşıdım ve nedense ilk geçişi hiç yakalayamadım.


7

Aşağıdaki benim için çalıştı:

  1. Uygulama adını settings.py dosyasına ekleyin
  2. 'python manage.py makemigrations' kullanın
  3. 'python manage.py migrate' kullanın

Benim için çalıştı: Python 3.4, Django 1.10


6

Benim gibi göçü sevmeyen insanlar aşağıdaki adımları kullanabilir.

  1. Senkronize etmek istediğiniz değişiklikleri kaldırın.
  2. python manage.py makemigrations app_labelİlk taşıma için çalıştırın .
  3. python manage.py migrateDeğişiklik yapmadan önce tablo oluşturmak için çalıştırın .
  4. İlk adımda kaldırdığınız değişiklikleri yapıştırın.
  5. 2. ve 3. adımları çalıştırın.

Bu adımlardan herhangi birini karıştırdıysanız, taşıma dosyalarını okuyun. Şemanızı düzeltmek veya istenmeyen dosyaları kaldırmak için bunları değiştirin, ancak bir sonraki geçiş dosyasının bağımlılıklar bölümünü değiştirmeyi unutmayın;)

Umarım bu gelecekte birine yardımcı olur.


5

Sen kontrol etmek istiyorum settings.pyyılında INSTALLED_APPSlistesi ve emin tüm modelleri ile uygulama olmadığını listelenmiştir olun.

makemigrationsProje klasöründe çalıştırmak , projeye dahil edilen tüm uygulamalarla ilgili tüm tabloları güncellemeye çalışacağı anlamına gelir settings.py. Bir kez eklediğinizde makemigrations, otomatik olarak uygulamayı içerecektir (bu çok fazla iş tasarrufu sağlar, böylece makemigrations app_nameprojenizdeki / sitenizdeki her uygulama için çalıştırmanız gerekmez ).


5

Geçici olarak tanımlanmayan belirli bir alanınız olması durumunda: Aynı ada sahip bir mülkünüz varsa iki kez kontrol edin.

misal:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

özellik alan tanımını "üzerine yazacak" için değişiklikler tarafından tanımlanmayacak makemigrations


İlgili bir serseri, hala onaylama / kontrolden kaçan hatalı biçimlendirilmiş bir alana sahip olmaktır. Tanımladım hourly_rate = models.DecimalField(sondaki '()' eksik) ve sessizce başarısız oldu.
adaçayı

5

Modelinizin olmadığından emin olun abstract. Aslında bu hatayı yaptım ve biraz zaman aldı, bu yüzden göndereceğimi düşündüm.


4

Bu yanıtı eklemek çünkü sadece bu yöntem bana yardımcı oldu.

Ben silindi migrationsçalıştırmak klasör makemigrationsve migrate.
Yine de şöyle dedi: Başvuru yapılacak göç yok.

migrateKlasöre gittim ve son oluşturulan dosyayı açtım,
istediğim taşıma işlemini yorumladım (tespit edildi ve oraya girildi)
ve migratetekrar çalıştırın .

Bu temel olarak taşıma dosyasını elle düzenler.
Bunu yalnızca dosya içeriğini anlarsanız yapın.


1
Çok teşekkür ederim! Bu yardımcı oldu
Sharpless512

3

schemamigration my_app --initialEski geçiş klasörünü yeniden adlandırdıktan sonra kullandınız mı? Dene. Çalışabilir. Değilse - veritabanını yeniden oluşturmaya ve syncdb + migrate yapmaya çalışın. Benim için çalıştı ...


10
Komuta schemamigrationyok - sanırım bu Güney'in bir parçası mı? Şu anda hiç taşıma klasörüm yok. Kaldırmak models.pyve rerunning bir inspectdbşey yapmak görünmüyordu.
TyrantWave

2
schemamigrationGüneyden. makemigrationsonun yerine geçer.
Craig Labenz

2
Bu hala geçerlidir. Ama değiştimakemigrations --empty
Iulius Curt

2

Aynı sorun vardı models.py dosyasında tanımladığınız sınıfların olduğundan emin olun, modelleri miras almanız gerekir.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()


1

Son zamanlarda Django'yu 1.6'dan 1.8'e yükselttim ve onlar için çok az uygulama ve taşıma yaptım. schemamigrationsGüneyi ve Django 1.6'da bırakılan Django 1.6'da göçler oluşturmak için kullandım .

Yükseltmeden sonra yeni modeller eklediğimde, makemigrationskomut herhangi bir değişiklik algılamıyordu. Ve sonra @drojf tarafından önerilen çözümü denedim (1. cevap), iyi çalıştı, ancak sahte ilk geçişi ( python manage.py --fake-initial) uygulayamadı . Benim tabloları (eski tablolar) zaten oluşturulmuş gibi bunu yapıyordu.

Sonunda bu benim için çalıştı, yeni modelleri (veya model değişikliklerini) manage.pymodels.py'den kaldırdı ve daha sonra tüm uygulamaların taşıma klasörlerini silmek (veya güvenlik yedeklemesi için yeniden adlandırmak) ve tüm uygulamalar için python makemigrations'ı çalıştırmak zorunda kaldı python manage.py migrate --fake-initial. Bu bir cazibe gibi çalıştı. Tüm uygulamalar için ilk geçiş oluşturulduktan ve sahte ilk makemigrationsgeçiş gerçekleştirildikten sonra, yeni modeller ekledi ve bu uygulamanın düzenli işlemlerini gerçekleştirdi . Değişiklikler şimdi tespit edildi ve her şey yolunda gitti.

Ben sadece burada paylaşmayı düşündüm, birisi aynı sorunla karşı karşıya kalırsa ( schemamigrationsuygulamaları için güneye sahip ), onlara yardımcı olabilir :)


1

Belki bu birine yardımcı olabilir, ben de aynı sorunu yaşadım.

Ben zaten serializer sınıfı ve görünümleri ile iki tablo oluşturduk. Güncellemek istediğimde bu hatayla karşılaştım.

Bu adımları izledim:

  1. ben yaptım .\manage.py makemigrations app
  2. İdam ettim .\manage.py migrate
  3. Her iki tabloyu da sildim models.py
  4. Tüm tablolarıma serializer ve view sınıfından sildim.
  5. Adım attım 1ve2 .
  6. Değişikliklerimi sadece models.py
  7. Tekrar uyguladım adım 5 .
  8. Tüm değişiklikleri geri yükledim.

Pycharm ile çalışıyorsanız, yerel tarih çok yardımcı olur.


1

Belki bu birisine yardım eder.

Ben sildim models.pyve ifadeler makemigrationsyaratmayı bekledim DeleteModel.

*.pycDosyaları silmeyi unutmayın !


1
./manage makemigrations
./manage migrate

Taşıma işlemleri DB'deki değişiklikleri izler, bu nedenle yönetilmeden yönetilene geçerseniz, veritabanı tablonuzun uğraştığınız Model ile ilgili güncel olduğundan emin olmanız gerekir.

Hala dev modundaysanız, şahsen IDE'mde olduğu gibi Modelimle ilgili django_migrations tablosundaki geçiş dosyalarını silmeye ve yukarıdaki komutu yeniden çalıştırmaya karar verdim.

UNUTMAYIN: veritabanınızda IDE'nizde _001 ve _003 ile biten bir taşıma işleminiz varsa. Django yalnızca güncellenecek herhangi bir şey için _004 ile biten bir taşıma işleminiz olup olmadığını görür.

2 (kod ve db geçişi) bağlantılıdır ve birlikte çalışır.

Mutlu kodlama.


1
  1. Senkronize etmek istediğiniz değişiklikleri kaldırın.
  2. İlk taşıma için python manage.py makemigrations app_label komutunu çalıştırın.
  3. Değişiklik yapmadan önce tablo oluşturmak için python manage.py migrate komutunu çalıştırın.
  4. İlk adımda kaldırdığınız değişiklikleri yapıştırın.
  5. 2. ve 3. adımları çalıştırın

0

Bu yanıtı ekledi çünkü yukarıda mevcut olanların hiçbiri benim için çalışmadı.

Benim durumumda daha da garip bir şey (oluyordu Django 1.7 Versiyon ) Benim içinde models.py ben vardı "ekstra" ı çalıştırıldığında (bir boş satır idi) ve benim dosyanın sonuna çizgisini python manage.py makemigrationssonucuydu komutu: msgstr "değişiklik bulunamadı".

Bunu düzeltmek için models.py dosyamın sonunda olan bu "boş satırı" sildim ve komutu tekrar çalıştırdım, her şey düzeltildi ve models.py'da yapılan tüm değişiklikler tespit edildi!


Django 2.0 + 'da bu boş satırın gerekli olduğunu düşünüyorum, yaptığınız şeyin tam tersini yapmak zorunda kaldım
Sumit Kumar Saha

@SumitKumarSaha haha ​​Şu anda Django 1.7 sürümünü kullanıyorum ve bu boş satır, geçiş hatasını çözmek için her şeyi denemenin 2 saat sebebiydi. Sumit'i paylaştığın için teşekkürler. İyi günler
Huskie

0

Aşağıdaki komutu kullanarak ilk taşıma işlemlerini taklit etmeniz gerekebilir

python manage.py migrate --fake-initial

0

Öncelikle bu çözüm, heroku sunucusuna dağıtım sırasında aynı sorunla karşılaşanlar için geçerlidir, aynı sorunla karşı karşıyaydım.

Dağıtmak için, settings.py dosyasına django_heroku.settings (locals ()) eklemek için zorunlu bir adım vardır.

Değişiklikler: Yukarıdaki satırı django_heroku.settings (locals (), databases = False) olarak değiştirdiğimde kusursuz çalıştı.


0

Benim durumumda modelimi modelimin tanımlandığı modeller klasörünün _ init _.py dosyasına eklemem gerekiyordu:

from myapp.models.mymodel import MyModel

-1

Bu çözümlerin hiçbiri benim için çalışmadığı için 2c'yi ekliyorum, ama bu işe yaradı ...

Az önce koşmuştum manage.py squashmigrations ve eski göç (dosyaları ve satırları django.migrations veritabanı tablosunda) kaldırmıştı.

Bu, son taşıma dosyasında şöyle bir satır bıraktı:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

Bu görünüşte Django'yu karıştırdı ve garip davranışlara neden oldu: koşu manage.py makemigrations my_app, ilk göçü sanki yokmuş gibi yeniden yaratacaktı. replaces...Hattı kaldırmak sorunu çözdü!


-1

python manage.py makemigrations hesabı 'accounts' için taşıma: accounts \ migrations \ 0001_initial.py - Model oluştur Müşteri - Model oluştur Etiket - Model oluştur Ürün - Model oluştur Sipariş

Not: Burada "hesaplar" benim uygulama adım

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.