I would need some clarification on how this works. It seems that the loss fraction table has two references to the output table, one for the hazard output and one for the risk output. Then you are adding to the Output objects two attributes (backreferences) .loss_fraction and .risk_loss_fraction, but where are they used? It seems never, so why they were added? BTW, if I try to access them by hand I get errors, things like:

>>> out.loss_fraction
DoesNotExist: LossFraction matching query does not exist.

>>> out.risk_loss_fraction
MultipleObjectsReturned: get() returned more than one LossFraction -- it returned 2! Lookup parameters were {'hazard_output__pk': 138}