Makemigrations and migrate in Django - python

I have a problem in the Django
For example:
In Definition of models. i have :
class Social_Network(models.Model):
Name = models.TextField(null=False)
Addresses = models.TextField(null=False)
And after running
python manage.py makemigrations
python manage.py migrate
Until this part everything its ok
My problem is starting now. When i want to change (Social_Network) models.
class Social_Network(models.Model):
Id = models.TextField(null=False)
Name = models.TextField(null=False)
Addresses = models.TextField(null=False)
I inserted 'Id' to 'social network' models
And after running
python manage.py makemigrations
python manage.py migrate
I encounter the following error
Please Help me

For convenience, each model has an AutoField named id by default unless you explicitly specify primary_key=True on a field in your model. See the documentation for AutoField for more details.

Related

How to Query data from MySQL database after updating model field in Django

After updating posts model field in MySQL database using using Django framework, I'm unable to query posts from the Database. Whenever I run the command python manage.py runserver, all seems to be well with the server. However, when enter the post url to display the list of posts I uploaded on the database before updating the model field, I get 1054, "Uknown column 'start_post.author_id' in the 'field list'
I have spent a couple of hours try to figure out why I'm getting the error but I still don't get it.
In model.py I had:
....
title = models.CharField()
preamble= models.Charfield()
body = models.TextField()
....
I updated the above model to:
....
title = models.CharField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
introduction = models.charfield()
body = models.TextField()
....
Before updating it everything was working appropriately. But after updating it I'm unable to access the list of posts on browser, from the url start\ as well as the post detail page. I didn't have the author field in the first model but I added it to the updated model. What can I do to solve this problem?
After update models, you have to run the commands:
python manage.py makemigrations
python manage.py migrate
makemigrations command will check the diffs between your current model in database and model in python code.
migrate will really run the migration to reflect your model with database model.
You can find more information about makemigrations and migrate in django documentation about makemigrations and migrate.

Django MySQL IntegrityError: ("Field 'created_at' doesn't have a default value")

I am new to Django.
IntegrityError: (1364, "Field 'created_at' doesn't have a default value")
occurred when I didn't write created_at for models I defined at models.py.
Every time I face such error, I add
created_at = models.DateTimeField(default=timezone.now, null=True)
to models.py and then run python manage.py makemigrations; python manage.py migrate --fake.
Is that OK? (I mean, does it follow Django best practice or not? )
When I was using Rails, I've never faced such issues. Why doesn't Django automatically handle created_at column?
Also, I'd like to know why --fake option removes this error.
version
Django==1.11.5
mysqlclient==1.3.12
Python 3.6.1
Thanks in advance.
It seems that you want to have an attribute created_at which is set on every creation of a model instance. There is an easier way for that:
created_at = models.DateTimeField(auto_now_add=True)
Here the docs explaining it in detail https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.DateField.auto_now_add
From your comments I think I can reproduce your steps. You had a model class in your models.py:
from django.db import models
class YourModel(models.Model):
one_field = models.CharField()
another_field = models.CharField()
Then you ran:
python manage.py makemigrations
python manage.py migrate
After that you added to your model class:
from django.db import models
class YourModel(models.Model):
one_field = models.CharField()
another_field = models.CharField()
created_at = models.DateTimeField(default=timezone.now, null=True)
but forgot to run the migrations and got the error message.
This is because Django ORM is looking for the property created_at, which it can't find in the DB.
You have to run the commands:
python manage.py makemigrations
python manage.py migrate
again. Remember that the option --fake won't change the DB. It just marks the migration as run. Use it only when you're sure what are you doing.
As Johannes Reichard has suggested you should better use auto_now_add (and there is also auto_now) for this purpose. Check the official documentation.
The drawback is that this field won't be shown in the admin. A workaround is to overwrite the save method:
def save(self, *args, **kwargs):
if not self.pk:
self.created_at = timezone.now() # import it from django.utils
super(YourModel, self).save(*args, **kwargs)

How do I migrate changes in Django when I'm uninheriting a model?

If I have two models and one inherits from another and setup the database with migrate etc. like so:
class TemplateProduct(models.Model):
type = models.CharField(max_length=20)
class Product(TemplateProduct):
name = models.CharField(max_length=80)
Then how would I migrate the db to make it so that Product does not inherit from TemplateProduct? Say I just want these models instead:
class TemplateProduct(models.Model):
type = models.CharField(max_length=20)
class Product(models.Model):
name = models.CharField(max_length=80)
When I try to migrate this, I get the following error:
django.db.utils.ProgrammingError: column "templateproduct_ptr_id" of relation "product_product" does not exist
And then when I remove the delete "templateproduct_ptr_id" from the migration, I get the following error:
django.core.exceptions.FieldError: Local field u'id' in class 'Product' clashes with field of similar name from base class 'TemplateProduct'
As the title says: how do I migrate changes in Django when I'm uninheriting a model?
So my solution was to delete both models. Then python manage.py makemigrations --merge, then I added the models back the way I wanted them, finally running python manage.py makemigrations --merge again to add the models back in.
This may not be the most elegant solution but it worked.

Django - Can we erase migration folder?

I have a class like this (I didn't know about abstract class at the beginning):
class Client(models.Model):
company_name = models.CharField(max_length=50)
referrer = models.ForeignKey(User, null=True, blank=True)
address = models.CharField(max_length=400, blank=True)
class Customer(Client):
def __str__(self):
return "{company:s}".format(company=self.company_name)
I tried to add abstract class to client, did the makemigrations but migrate crash with this message:
django.core.exceptions.FieldError: Local field 'address' in class 'Customer' clashes with field of similar name from base class 'Client'
I tried to restart from scratch because I don't need migration right now and delete the folder.
I run manage.py migrate and It tells me that I didn't have auth_user table. Then I use manage.py migrate auth then manage.py migrate and it works !
Cool, almost, my django project is now running but when I launch the test I still have the issue:
can't find auth_user table...
I guess test didn't create the migrate auth for the test database.
What did I do wrong?

Django Foreign Key not working

Edit:Django version 1.6.1
I keep getting this error when trying to create a RedditPost object through the admin:
no such column: subreddit_id
The subreddit_id error references RedditPost.subreddit (not Subreddit.subreddit) and then adds an _id at the end for some reason.
There's no problem with the reference. When trying to create a RedditPost from admin, the drop down menu for Subreddits shows all the available Subreddits objects.
class Subreddit(models.Model):
subreddit = models.CharField(max_length=100, primary_key=True)
title = models.CharField(max_length=100, null=False)
def __unicode__(self):
return smart_unicode(self.subreddit)
class RedditPost(models.Model):
comments_link = models.CharField(max_length=256, primary_key=True)
submitted_link = models.CharField(max_length=256, null=False)
rank = models.IntegerField(null=False)
title = models.CharField(max_length=100, null=False)
reddit_timestamp = models.DateTimeField(null=False)
updated_at = models.DateTimeField(auto_now_add=True, auto_now=True)
subreddit = models.ForeignKey('Subreddit')
RESOLVED/SOLUTION: I ended using "flush" which didn't clear up the databases when I made changes (I wasn't using any migrations). I had to use:
python manage.py sqlclear "app_name" | python manage.py dbshell
To completely clear the database and then I had to follow this link(Django South error with initial migration) to do the migration correctly.
_id is automatically added by Django. there are reasions for it.
your db table RedditPost doesnot just have this column whatsoever..
after changing the table (by adding this new column), do:
if django version < 1.7: (south needs to be installed)
python manage.py schemamigration yourapp --auto
python manage.py migrate yourapp
if django version >= 1.7:
python manage.py makemigrations
python manage.py migrate
I had the same problem. Delete your db.sqlite3 file. Then on the terminal,
python3 manage.py makemigrations
python3 manage.py migrate
That's it. But your all saved database values will be deleted.

Categories