Reputation: 1495
I am making changes to a model AppContactCnt
to add new fields to handle deleting of records.
Here is that models.py
class AppContactCnt(models.Model):
id_cnt = models.AutoField(primary_key=True)
# idcst_cnt = models.IntegerField()
idcst_cnt = models.ForeignKey(AppCustomerCst, models.DO_NOTHING, db_column='idcst_cnt')
idctp_cnt = models.ForeignKey(AppContactTypeCtp, models.DO_NOTHING, db_column='idctp_cnt')
idtrp_cnt = models.IntegerField()
name_cnt = models.CharField(max_length=50)
phone_cnt = models.CharField(max_length=50, blank=True, null=True)
email_cnt = models.CharField(max_length=100, blank=True, null=True)
note_cnt = models.CharField(max_length=100, blank=True, null=True)
receives_emails_cnt = models.BooleanField(blank=True, null=True)
deleted_cnt = models.BooleanField(blank=True, null=True)
# date_deleted_cnt = models.DateTimeField(blank=True, null=True)
# deleted_by_cnt = models.CharField(max_length=100, blank=True, null=True)
class Meta:
db_table = 'app_contact_cnt'
app_label = 'easytrade20'
I tried to add in managed = True
no change.
Also tried the following: Delete all previous migration files and pycache files except init.
python manage.py migrate --fake-initial
python manage.py makemigrations
python manage.py migrate
I am still getting No changes detected
I am not sure how to proceed, any assistance is apprecaited.
Upvotes: 1
Views: 9303
Reputation: 615
In case anyone is ever stumped by this, I had my models separated into different classes in a package models
. In the __init__.py
of models
I had to import the classes i.e.
__init.py__
from app.model.Foo import *
from app.model.Bar import *
app.model.Foo.py
from django.db import models
from app.models.Bar import Bar
class Foo:
class Meta:
app_label = 'app'
name = models.CharField(max_length=255)
bars = models.ManyToManyField(Bar)
app.model.Bar.py
from django.db import models
from app.models.Bar import Bar
class Bar:
class Meta:
app_label = 'app'
text = models.TextField()
Upvotes: 0
Reputation: 1210
Make sure your app is registered inside the settings.py
, and the INSTALLED_APP
section.
Upvotes: 0
Reputation: 827
If the answers above didn't work for you I propose you to make a model and migrations based on an existing database. The steps to complete this task are outlined below.
Below I suggests that your app directory also called
easytrade20
.
I think that you already have a database that you are working with and all migrations have been applied to it. If not, and saving the structure of migrations is not critical for you, then skip steps 2-3.
If any of your other apps have migrations that depend on
easytrade20
migrations you need to repeat steps 2-5 for every of them (by renamingeasytrade20
to your app name) before starting step 6 (and 6+ steps are required for that apps too).
pip install django==3.0.* -U
for 3.0.X (3.0.10
is latest release when I write these lines)
or
pip install django==3.1.*
for latest one (3.1 have not so much differences from 3.0 and maybe it is right choice for you)
Use showmigrations command to show applied migrations:
python manage.py showmigrations
You'll see structure with all apps and their migrations like this (app1
and app2
for example):
app1
[X] 0001_initial
app2
[X] 0001_initial
[X] 0002_some_other_migration
You'll see your apps and some django apps/third-party packages, like admin
, auth
, database
, sessions
etc.
If you'll see all [X]
near every migration - all is fine, go on.
If you'll see some [ ] migration_name
- try to apply these migrations first. Run python manage.py migrate app_name migration_name
for every unapplied (unchecked) migration top down for every app (app_name
for example).
Use inspectdb to generate models:
python manage.py inspectdb > generated_models.py
File generated_models.py
will be created. You need to copy from this file all models that you created for easytrade20
app. Replace your models.py
with generated models and remove managed = False
at least in the model AppContactCnt
.
easytrade20
migrations from databasepython manage.py migrate --fake easytrade20 zero
And now if you'll run python manage.py showmigrations easytrade20
you'll see that all migrations unapplied.
That's it. Remove directory easytrade20/migrations
completely.
Then if you'll run python manage.py showmigrations easytrade20
you'll see text (no migrations)
Run makemigrations command:
python manage.py makemigrations easytrade20
Folder easytrade20/migrations
will be created. If not, then you'll need to check two things:
settings.py
to ensure that easytrade20
included in your INSTALLED_APPS
.easytrade20
app settings. Ensure that your files have similar code:# easytrade20/__init__.py
default_app_config = 'easytrade20.apps.EasyTradeConfig'
# easytrade20/apps.py
from django.apps import AppConfig
class EasyTradeConfig(AppConfig):
name = 'easytrade20'
If you have database with this table then fake migration:
python manage.py migrate easytrade20 --fake-initial
If not, then run without --fake-initial
:
python manage.py migrate easytrade20
Change your models.py
file.
Run python manage.py makemigrations easytrade20
. New file in your easytrade20/migrations
directory will be created.
Run python manage.py migrate easytrade20
to apply new migration.
Upvotes: 0
Reputation: 88499
You have set app_label = 'easytrade20'
in the meta option, but Django is unable to detect an app named easytrade20
in your project. That's why there aren't any changes.
So, add easytrade20
to your INSTALLED_APPS
or remove app_label = 'easytrade20'
from the model's Meta, and try again to run your migrations.
Upvotes: 4
Reputation: 7404
The app is likely not listed in INSTALLED_APPS
located in settings.py, therefore Django has not registered your application and will not detect migrations that need to be run in that application.
Add easytrade20
to your INSTALLED_APPS
and try again to run your migrations.
Upvotes: 0
Reputation: 3720
try this:
python manage.py makemigrations [app_name]
python manage.py migrate
Upvotes: 4