When you develop a Django app, you always need to change the model fields. But how to make the changes take effect (add/remove table column to/from backend database table ). To a beginner, this question may be confused. This article will tell you how to do it.
1. Change Django Model Field Steps.
- Change model class’s field in Django application models.py file. Below example add a new field user_desc = models.CharField(max_length=100, default=”), and remove field emp_onboard_date = models.DateTimeField(auto_now=True).
class Employee(models.Model): ...... #emp_onboard_date = models.DateTimeField(auto_now=True) user_desc = models.CharField(max_length=100, default='') ......
- You had better specify a default value for the new field, otherwise, you may encounter the below error message when you make migrations.
$ python3 manage.py makemigrations dept_emp You are trying to add a non-nullable field 'sex' to employee without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Quit, and let me add a default in models.py Select an option:
- Then go to the Django project root folder in a terminal and run the command makemigrations. It will generate a new migration .py file in the application migrations folder ( dept_emp / migrations ).
$ python3 manage.py makemigrations dept_emp Migrations for 'dept_emp': dept_emp/migrations/0004_auto_20190228_0617.py - Remove field emp_onboard_date from employee - Add field user_desc to employee Process finished with exit code 0
- Execute the command migrate in a terminal, then it will apply the above migration .py file to the database table.
$ python3 manage.py migrate dept_emp Operations to perform: Apply all migrations: dept_emp Running migrations: Applying dept_emp.0004_auto_20190228_0617... OK Process finished with exit code 0
- Then open the Django project sqlite3.db file to see that the database table has been changed accordingly.