Business logic in models

, , django, models, mixins

In my recent project there was a lot of data business logic, so I had to organize this code somehow. In this article I'll describe a few hints on how to it.

Mixins

Simple business logic functions should in models or managers. When there's a lot of them, the can be split in mixins.

    # logic.py

    class EventLogic(object):
        def start(self):
            if self.condition():
               # ...

    # models.py

    class Event(models.Model, EventLogic):
        name = models.CharField()
        # ...

Custom exceptions

For business logic errors you should declare custom exception classes. It's not fun to understand what this specific IntegrityError means.

Generic views

When all logic is in model and can throw, say, BusinessLogicException, we can write views like this:

    from django.contrib import messages

    def event_action(requets, event_id, action):
        # event = get_object_or_404(...)
        try:
            getattr(event, action)(request.user)
        except BusinessLogicException, e:
            messages.warning(request, e.message)

        return redirect(request.POST.get('next') or event)
 
contact us right now