41

I'm trying to learn python/django.

Right now, I have all of my models in models.py

Is it possible to have my models broken out so that I can have a single file per model in a separate models folder so that I can do something like:

~/myproject/myapp/models/user.py ~/myproject/myapp/models/group.py

Thanks

Paolo
  • 20,112
  • 21
  • 72
  • 113
john
  • 33,520
  • 12
  • 45
  • 62

3 Answers3

75

It is possible, just make sure to import all the models you create in __init__.py in your models directory. In your case, it would look like this:

# __init__.py
from .user import UserModel
from .group import GroupModel

This needs to be done because Django looks in app.models for an app's models.

As others have mentioned, for versions of Django prior to 1.7, you'll also need to specify your app's name in the app_label attribute in the Meta class in your model:

class UserModel(models.model):
    # fields here

    class Meta:
        app_label = "myapp"

http://docs.djangoproject.com/en/1.7/ref/models/options/#app-label

JosefAssad
  • 4,018
  • 28
  • 37
John Debs
  • 3,714
  • 2
  • 25
  • 35
  • 2
    This drove me crazy, so for those who come after, in 1.10 there needs to be a '.': `from .user import UserModel`. As mentioned here: https://docs.djangoproject.com/en/1.10/topics/db/models/#organizing-models-in-a-package – John McGrath Feb 22 '17 at 17:37
  • 1
    also care take care of the order of the `import` s in `__init__.py`. else you will get strange error like `First parameter to ForeignKey must be either a model, a model name, or the string 'self'` – suhailvs Sep 12 '18 at 09:16
5

You could have a folder called models but then in each model class you'll need to include:

class Meta:
    app_label="appname goes here"

ps. Don't forget a __ init__.py file like I always do.

Paolo
  • 20,112
  • 21
  • 72
  • 113
James Khoury
  • 21,330
  • 4
  • 34
  • 65
0

in the models folder you create the file __init__.py you import your class in it. ex : myproject/myapp/models/__init__.py from .myfile import myclass