South Migration Issues - python

I have looked at these questions; http://south.readthedocs.org/en/latest/tutorial/part1.html, South ignores change in field default value in Python / Django & Django-south not detecting DB changes and many more all over SO but I can't seem to fix my problem.
I have an existing model with data in it's tables, and I'm adding another model via Foreign key to it. I have run schema migrations and migrations, but nothing has proved to work. This is the code:
class UserNote(models.Model):
user = models.ForeignKey(User)
description = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class UserNoteType(models.Model):
name = models.CharField(max_length=20)
I need to add UserNoteType to UserNote as Foreign key,and every attempt to add the field results in "not installed", "not defined". I've been battling with this for hours now, any help would assist greatly.
EDIT:
Error I recieve when I try create a Schema-migration:
CommandError: One or more models did not validate:
auth.usernote: 'note_type' has a relation with model , which has either not been installed or is abstract.

Have you tried to convert your existing app for South with the following command ?
python manage.py convert_to_south my_app
More informations can be find here

The UserNote model was attached to the Django UserAuth application. This resulted with South looking in the wrong application each time. I fixed this issue by creating a custom command to manually insert the new column note_type to the UserNote table.
Thank you so much for your help.

For your reference
If you are creating new project, beginning it's self you need to setup south, Try below:
python manage.py syncdb
python manage.py schemamigration --initial firstapp
python manage.py migrate forecasts --fake
python manage.py schemamigration --auto firstapp
python manage.py migrate google
After the development side you are planning to include south, then try below
./manage.py schemamigration --auto firstapp
./manage.py migrate firstapp

Related

Django makemigrations thrown an error if I add a custom model (Tenant) with app_label='auth'

This is the model that I have
class Tenant(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(unique=True)
class Meta:
app_label = "auth"
When I makemigrations in a new venv or run pytest. I always get an error saying
django.db.migrations.exceptions.NodeNotFoundError: Migration
nqm_core.0001_initial dependencies reference nonexistent parent node
('auth', '0013_tenant')
I tried the following ways to resolve this issue
Remove migrations files and re migrate
Fake migrations with zero and then re migrate
Create new database and migrate
Update django and migrate
Create new venv and migrate
None of the above ways worked. The issue got resolved only after I removed the app_label from class Meta for that model. Also I tried removing dependency in the initial migration file but the DB won't migrate at all.
Is this a bug or is there a certain way with which I have to run the migration
Currently, I only use the following commands
./manage.py makemigrations
./manage.py migrate
Django has default built-in app with name auth, which handles such models like User, Permission and others.
The easiest solution for you will be to use another app_label

How to fix: Django error: no such table: main.classroom_student__old

I am following this tutorial for learning how to create a Django (v2.0.1) app with multiple user types (teachers and students in this case). I cloned the associated code from the Github Repository, migrated the pre-made migrations and ran the site on localhost using:
python3 manage.py migrate
python3 manage.py runserver
The site works almost perfectly (Teacher sign up, login, quiz creation, and student log in are all in order). However, the student Signup fails with the following error:
OperationalError at /accounts/signup/student/
no such table: main.classroom_student__old
With the traceback pointing eventually to the file
django_school/classroom/forms.py, line 39:
student.interests.add(*self.cleaned_data.get('interests'))
That line comes from the definition of the following class in that forms.py file:
class StudentSignUpForm(UserCreationForm):
interests = forms.ModelMultipleChoiceField(
queryset=Subject.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
class Meta(UserCreationForm.Meta):
model = User
#transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_student = True
user.save()
student = Student.objects.create(user=user)
student.interests.add(*self.cleaned_data.get('interests'))
return user
What I have tried:
Following answers to the many similar questions on this site, I assumed it was a migration issue so I tried running:
python manage.py migrate --run-syncdb
Operations to perform:
Synchronize unmigrated apps: crispy_forms, humanize, messages, staticfiles
Apply all migrations: auth, classroom, contenttypes, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Running migrations:
No migrations to apply.
But the error persisted. I then deleted db.sqlite3 as well as all migration files associated with the app classroom. I then ran python3 manage.py makemigrations followed by python manage.py migrate --run-syncdb, again to no avail.
This makes me think that this is an issue with the way the code is adding "interests" to the "student" user object. Indeed, commenting out the line in question stops the error and creates the new student user, however this has the obvious issue that the student has no interests stored.
Running python manage.py sqlmigrate classroom 0001 shows:
...
-- Add field quizzes to student
--
ALTER TABLE "classroom_student" RENAME TO "classroom_student__old";
CREATE TABLE "classroom_student" ("user_id" integer NOT NULL PRIMARY KEY REFERENCES "classroom_user" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "classroom_student" ("user_id") SELECT "user_id" FROM "classroom_student__old";
DROP TABLE "classroom_student__old";
COMMIT;
So the database in question (classroom_student__old) is getting created and deleted when another attribute "quizzes" is added to the student user object. Could this be creating the issue?
Instead of downgrading to sqlite 3.24.0, another solution for making the tutorial you listed run successfully is to change the requirements.txt file's django version to 2.2.7 before running the "pip install -r requirements.txt" command.
So, your requirements.txt file for this project would be:
Django==2.2.7
django-crispy-forms==1.7.0
pytz==2017.3
Just to close the question, #SwapnilBhate had the correct answer; it was the sqlite version 3.26.0. After downgrading to 3.24.0, deleting the directory, and reinstalling, everything works perfectly.
1.0) First try:
python manage.py migrate YOURAPPNAME --fake
2.0) If it still doesn't working delete all the migrations files inside your app migrations(except init.py) and pycache folder. After that run makemigrations and migrate.
Use django==2.2.7
then python manage.py migrate,
and finally python runserver

I can't migrate at another database

I have well working project on local. I use postresql.
Ok. I create another database in postgres locally and specify new name/user/password in settings.py of project.
When I do
$ python manage.py makemigrations
I get error as
relation 'report_person' not exist
And I have tried delete (and not delete) directory 'migrations'. delete pycache. I tried specify Sqlite3 as database - but the same error.
Why I ask?
My project don't want to work with another database)
I succesfully push project on heroku. Specify parameters in settings.py. Create postgresql. But I can't make migrate on heroku) the same error.
I do makemigrations and git commit before push on heroku, but no result
Help me please.
Thank you
Have a nice day!
try migrating with --fake
python manage.py migrate --fake
python manage.py migrate yourappname --fake
and then again
python manage.py makemigrations
python manage.py migrate
Oh, I can't explain this situation. All problems in one little model.
It is from models.py:
from django import models
class Person(models.Model):
name = models.CharField(max_length=255)
position = models.CharField(max_length=255)
This part of forms.py (crazy):
from django import form
q = models.Person.objects.all()
qty = range(len(q))
PersonForm = type('PersonForm',
(forms.Form,),
{'person'+'_'+str(q[i].id): forms.BooleanField(label=q[i].name,
required=False) for i in qty})
And I must before migrations delete this 'PersonForm'. Then migrate will be succesfully in new any database. And after migrations I put this form again.
Ok. I don't undestand, why?)

Django 1.8 OperationalError: no such column:

I'm using django 1.8 and I'm having problems adding to my models.py. Currently it's:
from django.db import models
# Create your models here.
class Company(models.Model):
role = models.CharField(max_length=32, blank=True)
name = models.CharField(max_length=70, blank=True)
and it works perfectly fine but whenever I try to add to this and then run the server I get
OperationalError: no such column [added element]
For example I added founder = models.CharField(max_length=200, blank=True) and I ran the program and I got
django.db.utils.OperationalError: no such column: companies_company.founder
Run in your console this commands:
manage.py makemigrations app_name
manage.py migrate app_name
Every time when you change model in your app you should migrate changes to your db using makemigration and migrate commands. When you adding a new column to your db table you must add value of this column to all existing rows. You can do it by seting default value in your new field in your model.
Or set values when run migrate command ( django automatically propose this)
You can read about this in docs
This type of problem occurs when there are some operations on the model field in some other files such as forms.py or views.py other than models.py when you run makemigrations. If you read the traceback carefully you can figure it out from which file the problem is originating.
For example, if the traceback tells you some complaints in forms.py which may happen to use some of the model fields, just comment out the code that is working on the model fields and rerun makemigrations again. Hopefully it resolves the issue.
If it does, you can then remove the comments that you added before.
You have to re sync the database using python manage.py makemigrations
Maybe not optimal, but it worked for me doing that (and the default thing did not work):
delete all files apart from the init.py in migrations folder
delete the db.sqlite file
doing: python manage.py runserver (without this one previous to migrate, migrations, that did not work, I think it's linked to the views / templates calling tags, so has to run first)
python manage.py migrate
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
python manage.py createsuperuser
I found that clearing all data with python3 manage.py sqlflush and then python3 manage.py flush
Then makemigrations, sqlmigrate, and then migrate
It will delete all data in the SQL database including users and objects

Django : Table doesn't exist

I dropped some table related to an app. and again tried the syncdb command
python manage.py syncdb
It shows error like
django.db.utils.ProgrammingError: (1146, "Table 'someapp.feed' doesn't exist")
models.py
class feed(models.Model):
user = models.ForeignKey(User,null=True,blank=True)
feed_text = models.CharField(max_length=2000)
date = models.CharField(max_length=30)
upvote = models.IntegerField(default=0)
downvote = models.IntegerField(default=0)
def __str__(self):
return feed.content
What I can do to get the tables for that app ?
drop tables (you already did),
comment-out the model in model.py,
and ..
if django version >= 1.7:
python manage.py makemigrations
python manage.py migrate --fake
else
python manage.py schemamigration someapp --auto
python manage.py migrate someapp --fake
comment-in your model in models.py
go to step 3. BUT this time without --fake
For those that may still be having trouble (like me), try this out:
Comment out all the URL's in the main app's urls.py
Then go ahead and run migrations:
$ ./manage.py makemigrations
$ ./manage.py migrate
The problem was alleviated by removing the ()'s
solved_time = models.DateTimeField('solved time', default=timezone.now())
to
solved_time = models.DateTimeField('solved time', default=timezone.now)
I got this answer from reddit
What solved my problem in situation when manage.py setmigration and then migrate to the SQL database is not working properly did is following:
Run command : python manage.py migrate --fake MyApp zero
After that: python manage.py migrate MyApp
And the problem that rises with connections.py and and after running correctly the migration command is solved! At least for me.
I'm using Python (3.x), MySQL DB, Django (3.x), and I was in situation when I needed after some time of successfully creating tables in my database, that some error regarding connections.py raises. But, above commands helped. I hope they will help all those who are having these type of problems.
I just ran migrations with the name of the app attached, for all the apps I had provisioned and that worked.
e.g. python3 manage.py makemigrations my_custom_app
After running for all of them I ran a migrate command to seal the deal.
python3 manage.py migrate. That was it. I'm still wondering why django behaves this way sometimes though.
none of the above solutions worked for me, I finally solved by
sudo systemctl stop mysql.service
sudo apt-get purge mysql-server
sudo apt-get install mysql-server
sudo systemctl stop mysql.service
In my case the code that I pulled had managed = False and I wanted the tables to be maintained by Django.
But when I did makemigrations the custom tables were not being detected or I was getting the error that the app_name.Table_name does not exist
I tried the following:
delete all the migration files inside the migrations folder (except init.py file) and then makemigrations then finally migrate
above 2 answers
this
PS: This solution is only feasible if backup is present or data is not important or you are just started creating the tables, as purging mysql will lead to loss of data
This is linked to the migration data in the scripts inside the project not matching with the migration scripts in the database as far as I could tell.
I solved this by the following steps :
Delete all the migration scripts under migration folder except __ini__
Make sure that the model.py contains the same structure as the table in the database and managed=True
Remove all Django Created tables like auth_user,... etc
Run the following code
$ ./manage.py makemigrations
$ ./manage.py migrate
This will create the migration scripts again and will apply it to your database.
I had this issue where I was playing with same database structure in production vs development. While dropping and recreating tables will probably resolve the issue, its worth checking your database itself and see if the model is actually correct. For myself I created the development database incorrectly with the table names all in lowercase while in production the first letter of tables were capitalized. I used the python manage.py inspectdb command on production db, and compared it to the model and realized that in the model it was trying to insert data to table 'test' instead of 'Test' for example. Hope that helps some of you in future.
I had a similar issue.
I had another python (with a class) file which need access to DB.
For some reasons, when running 'makemigrations' this file was processed (I guess this is linked to some import chains).
In this class, I had a method containing a default arg method(defaultModel=Model.get_default()) in the signature which was accessing to the default object in the DB (static method included in the Model class).
A the import time, this default arg was evaluated and as the table is not populated yet, it gives this error.
So I just set None for the default args and asks for the default model object inside the method. This solved the issue.
I have to face same issue and there are a couple of approaches, but the one I think is the most probable one.
Maybe you are loading views or queries to database but you havenĀ“t granted enough time for Django to migrate the models to DB. That's why the "table doesn't exist".
Make sure you use this sort of initialization in you view's code:
Class RegisterForm(forms.Form):
def __init__(self, *args, **kwargs):
super(RegisterForm, self).__init__(*args, **kwargs)
A second approach is you clean previous migrations, delete the database and start over the migration process.
I tried all of the above tricks and never worked for me.
I commented on all imports and URLs that called a particular Table
In this solution, your data will be removed. I removed the app and created the app again. I copied the app folder somewhere and delete the app folder from my project. I commented on all lines in urls.py and files similar views.py and admin.py that use this app. also app name in settings.py.
In mysql:
truncate django_migrations;
truncate django_admin_log;
Do this for all models in your app and change n.
n is app id.
delete from auth_permission where content_type_id=n
delete from django_content_type where app_label='appname'
python manage.py startapp your_app_name
Then uncomment previous lines and restore files and run
python manage.py makemigrations
python manage.pt migrate
I faced the same problem, some of the above mentioned answers seemed not to work for me, but here's a simple 4 step solution:
1) Delete the migrations files below __init__.py (don't delete __init__.py) in your specific app.
2) python manage.py makemigrations AppName
3) python manage.py migrate --fake AppName zero
4) python manage.py migrate AppName
Hope these works for you.
I faced the same issue earlier when I accidentally deleted my migrations folder in an app. I was able to fix it by running manual makemigrations for that specific app.
Here's the fix for Windows,
py manage.py makemigrations <your_app_name>
py manage.py migrate
For other OS you need to replace py with python3 or python
I hope this helped fix your issue!
if the python manage.py migrate still doesn't work I mean when you do this it nothing do anything you can delete the app's migrations from django_migrations table after then do
python manage.py migrate

Categories