Django is well known for its ORM efficiency. More often, we come across a point where we want to integrate our existing database to a new backend framework. And first step towards it is generally (ORM supporting frameworks) creating database models. In this article we will learn creating Django models of an existing database.
Database set up
It is quite possible to integrate Django into legacy databases. First step towards it is to set up database connection for Django to connect to existing database in settings.py file.
Django inspectdb command
Once you have set up the database connection in Django, you can auto-generate the models. Yes you heard it correctly! Django provides a utility to auto-generate models from an existing database via inspectdb command.
You can create models by introspecting an existing database by executing following command:
$ python manage.py inspectdb
The above command will output all the models Django can create from the existing database to stdout. You can save this as a file by using standard Unix output redirection:
$ python manage.py inspectdb > models.py
The output file will be saved to your current directory. Move that file to the correct app and you have a good starting point for further customization.
Remember: You need to run the Django project before running inspect db
More options for inspectdb
inspectdb command by default without any argument, outputs all the tables from the database. If you want to introspect particular table(s), you can pass table names as an argument separated by space after the command:
$ python manage.py inspectdb table1 table2
You can refer to Django documentation for more information.
Points to remember
- If inspectdbcannot map a column's type to a model field type, it'll use TextField and will insert the Python comment'This field type is a guess.'next to the field in the generated model. Keep an eye out for that, and change the field type accordingly if needed.
- 
If a database column name is a Python reserved word (such as pass,class, orfor),inspectdbwill append'_field'to the attribute name and set thedb_columnattribute to the real field name (e.g.,pass,class, orfor).
 For example, if a table has anINTcolumn calledfor, the generated model will have a field like this:for_field = models.IntegerField(db_column='for')inspectdbwill insert the Python comment'Field renamed because it was a Python reserved word.'next to the field.
- If your database contains tables that refer to other tables (as most databases do), you might need to rearrange the order of the generated models so that models that refer to other models are ordered properly. 
- Django doesnโt create database - defaultswhen a default is specified on a model field. Similarly, database defaults aren't translated to model field defaults or detected in any fashion by- inspectdb.
- By default, - inspectdbcreates- unmanaged models. That is,- managed = Falsein the model's- Metaclass tells Django not to manage each table's creation, modification, and deletion. If you do want to allow Django to manage the table's life-cycle, you'll need to change the- managedoption to- True(or simply remove it because True is its default value).
- Each database table is converted to a model class (i.e., there is a one-to-one mapping between database tables and model classes). This means that you'll need to refactor the models for any many-to-many join tables into - ManyToManyFieldobjects.
- 
Foreign-key detection only works with PostgreSQL and with certain types of MySQL tables. In other cases, foreign-key fields will be generated as: IntegerField's, assuming the foreign-key column was anINTcolumn.
This feature is meant as a shortcut, not as definitive model generation. After you run it, you'll want to look over the generated models yourself to make customization.
 
 
              
 
    
Top comments (5)
I just get the attached few lines.
This is an auto-generated Django model module.
You'll have to do the following manually to clean this up:
* Rearrange models' order
* Make sure each model has one field with primary_key=True
* Make sure each ForeignKey has
on_deleteset to the desired behavior.* Remove
managed = Falselines if you wish to allow Django to create, modify, and delete the tableFeel free to rename the models, but don't rename db_table values or field names.
from django.db import models
I tried both schema and dbo
Pls help
Very likely you have to configure the schema in your app/settings.py
It's described here: code.djangoproject.com/ticket/28774
This is useful. Thanks!
Very cool! Thanks!
This is nice, thanks for this