For me, it is relatively easy. When you think of an entire project and
draw it out on paper with boxes and lines you can see where the separate
portions naturally fall.
Some things (nearly) always exist in (nearly) all projects. For example,
users and user related items like profiles. For me, that means a
separate app. Likewise (for me) I keep companies in a separate app.
Licensed relationships between companies (for me) also go in the company
app.
I don't necessarily try to make them re-usable right away. Working on my
second project I just copied portions of the first and tweaked them as
necessary. If that starts to bother me in future I might rework one or
two apps so they become re-usable and supremely elegant. Maybe.
The idea is to become comfortable putting "from company
importAddress,Company, Division, Phone" and just use them without
thinking in your views, unit tests or other portions of your project
where they might be needed. At least I don't have to scratch my head and
try to remember where Address is defined. Of course it belongs in the
company app alongside Phone and Division.
One of my projects has an enormous app with 40 models. I tried to
separate them into two apps but my inexperience caused circular import
problems. That forced me to keep them all together. In hindsight keeping
them together was the right thing to do because those 40 models are all
in the same brainspace.
I also have a "common" app to contain bits and pieces like utilities,
generic template tags, exceptions imported from various places so I can
always say in my code everywhere "from common.exceptions import
ThisErrorOrThat". My common app doesn't have any models.
The bottom line is that you need to be comfortable in your own
brainspace. If you can think about slicing off the easy bits into
separate small apps it will leave the main game slightly more simple.
And that is always good!
Cheers
Mike