AlliDeacon
AlliDeacon

Reputation: 1495

Django 3.0.7 - No Changes Detected after making Changes to Model

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

Answers (6)

cjwillis48
cjwillis48

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

Ishmael MIRZAEE
Ishmael MIRZAEE

Reputation: 1210

Make sure your app is registered inside the settings.py, and the INSTALLED_APP section.

Upvotes: 0

Yevhenii M.
Yevhenii M.

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 renaming easytrade20 to your app name) before starting step 6 (and 6+ steps are required for that apps too).


0. Backup your files and database before changes

1. Update your Django version to the latest release

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)

2. Check if all migrations are applied

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).

3. Make new models based on your database structure

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.

4. Remove information about easytrade20 migrations from database

python manage.py migrate --fake easytrade20 zero

And now if you'll run python manage.py showmigrations easytrade20 you'll see that all migrations unapplied.

5. Remove your migrations directory

That's it. Remove directory easytrade20/migrations completely.

Then if you'll run python manage.py showmigrations easytrade20 you'll see text (no migrations)

6. Generate new 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:

  1. Your settings.py to ensure that easytrade20 included in your INSTALLED_APPS.
  2. Your 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'

7. Apply initial migration

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

8. Make changes to your model, create and apply migrations

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

JPG
JPG

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

pygeek
pygeek

Reputation: 7404

Problem

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.

Solution

Add easytrade20 to your INSTALLED_APPS and try again to run your migrations.

Upvotes: 0

Felix Eklöf
Felix Eklöf

Reputation: 3720

try this:

python manage.py makemigrations [app_name]
python manage.py migrate

Upvotes: 4

Related Questions