One of the first things I noticed when I started with Django was that models and views were single files. Now I’ve read various opinions on how things should be handled (multiple modules vs. multiple files) but I’m of the opinion that clarity is always better. So even if you have a single model, I’d rather have the file be named something descriptive rather than the generic models.py.
Breaking things up into multiple files is quite straight-forward – delete models.py, create a models directory, add __init__.py and create your model classes. Here’s an example:
__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from blog import Blog | |
from blogcomment import BlogComment |
Note: In order for syncdb to see your models and work correctly, you’ll need to import the models in __init__.py.
models/blog.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
class Blog(models.Model): | |
title = models.CharField(max_length=255) | |
slug = models.CharField(max_length=255) | |
author = models.CharField(max_length=100) | |
blog = models.TextField() | |
image = models.CharField(max_length=20) | |
tags = models.TextField() | |
created = models.DateTimeField('date created', auto_now_add=True) | |
updated = models.DateTimeField('last updated', auto_now_add=True, auto_now=True) | |
def __unicode__(self): | |
return self.title | |
class Meta: | |
app_label = 'app' |
Note: The Meta class is necessary for Django to associate the model correctly. Just set it to the name of your application. Otherwise syncdb won’t see your models or you’ll get a lovely error like the following when one of your models contains a foreign key:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CommandError: One or more models did not validate: | |
app.blogcomment: 'blog' has a relation with model <class 'app.models.blog.Blog'>, which has either not been installed or is abstract. |
You can then import your models like this:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# import one model | |
from app.models import Blog | |
# import a bunch | |
from app.models import * |