views:

251

answers:

4

This is a pretty simple django patterns question. My manager code usually lives in models.py, but what happens when models.py is really huge? Is there any other alternative pattern to letting your manager code live in models.py for maintainability and to avoid circular imports?

A question may be asked as to why models.py is so huge, but let's just assume it's size and breadth of utility is justified.

+2  A: 

What I did when building Django apps was to create a [modelname].py file with just the specific model code, manager code and sometimes form code and used an __init__.py file to import then all in the models directory. This helped me atleast in keeping it managable.

Tomh
+10  A: 

I prefer to keep my models in models.py and managers in managers.py (forms in forms.py) all within the same app. For more generic managers, I prefer to keep them in core.managers if they can be re-used for other apps. In some of our larger apps with models/modelname.py that will contains a manager and the model code which doesn't seem bad.

Jeff Triplett
How do you then cleanly deal with models.py needing to import managers.py and vice-versa?
Jeff
managers.py shouldn't need to import models -- the model in question will always be available as `self.model` on the manager.
jacobian
+2  A: 

I always place mine in managers.py. If you have a circular import issue remember that a) You can reference the model class for a manager at self.model, and b) You can do imports inside of functions.

Alex Gaynor
+4  A: 

Your best bet with a large set of models is to use django modules to your advantage, and simply create a folder named models. Move your old models.py into this models folder, and rename it init.py. This will allow you to then separate each model into more specific files inside of this model folder.

You would then only need to import each model into your init.py's namespace.

So, for instance, you might want to separate it into:

yourapp/
    models/
        __init__.py # This file should import anything from your other files in this directory
        basic.py # Just an example name
        morespecificmodels.py # Just an example name
        managers.py # Might want to separate your manager into this

Then your init.py can just be:

from basic import * # You should replace * with each models name, most likely.
from managers import YourManager # Whatever your manager is called.

This is the structure that I use when my model files get huge, however I try to separate things into more pluggable apps as often as possible - so this is rarely used by me.

Hope this helps.

monokrome