Creating the model's managers
To make our application more readable and not clutter the endpoints with a lot of business logic, we are going to create managers for our model classes. If you followed the previous chapter, you should be very familiar with this. In a nutshell, managers are an interface that provide query operations to Django models.
Note
By default, Django adds a manager to every model; it is stored on a property named objects. The default manager that Django adds to the models is sometimes sufficient and there's no need to create a custom manager, but it is a good practice to keep all database-related code within the model. This will make our code more consistent, readable, and easier to test and maintain.
In our case, the only model we are interested in creating is a custom model manager called Order, but before we start implementing the order manager, we need to create a few helper classes. The first class that we need to create is a class that will define custom exceptions...