A "project" can also be an "app" and define database models. You just add your "project" to `INSTALLED_APPS`.
I often find it convenient for the "project" to also be the main "app". It seems redundant to have two packages, one for the "project" and one for the "app" when they would both logically derive their name from the site.
To avoid a top level namespace conflict, I have often seen generic top level package name like `project` or `djangosite`, which make it difficult to then install one site's code as a dependency for another site. Or we end up needlessly repeating the name and having the app as a sub-package (e.g. `foo.foo`).
The best options if they are to remain separate seems to be to have a generic sub-package for the project (e.g. `foo.project`) or app (e.g. `foo.base` or `foo.core` or `foo.main`), which allows `foo` to be more easily used as a dependency in another project.
The former seems a little counter intuitive, as one might assume that a project is a container for apps (though it is not always and doesn't have to be).
The latter is problematic because "base", "core" and "main" are not very good app names. In that case, you'd likely want to set the app label for your models and the verbose name for your app config to "foo" anyway, so you might as well just make `foo` your app as well as being your project.
The things most likely to be confusing when treating a project as an app are:
1) The project's root URLconf and the app's URLconf.
An app's URLconf doesn't normally include URLconfs from other apps, but a project's root URLconf does. This confusion could largely be eliminated by changing the name of the default root URLconf in the startproject template and in the docs to `root_urls.py`.
This makes it clear what's what, and would allow the app URLs to be used more easily in other projects.
2) Project `TEMPLATE_DIRS` vs the `templates` directory in an app.
Although to be fair, I've seen many developers struggle just as much (if not more) with where to save and where to find templates when the project and main app are completely separate. It can take a while for newcomers to understand the difference, and then they often remain unsure of where they should save a new template and where they should look to find a template they need to edit.
I think this problem would be reduced by having the project also be the main app, and for its `templates` directory to be `TEMPLATE_DIRS[0]`. Ancillary apps would still have their own `templates` directories, but for the most part people would only need to look in one place to edit a template for the project, and they would be less likely to save a new template in the wrong place.
When used as a dependency in another project, all the templates would be available (not only app templates), but they would no longer be in `TEMPLATES[0]` so the other project could easily override anything. With separate projects and apps, the other project might not have access to all the templates, unless they explicitly add the first project to `TEMPLATE_DIRS`.