Django how to make this view faster?
There's nothing intrinsically time-consuming here code-wise - I think the best approach is to make sure that your database tables are set up correctly with the required indices. Perhaps create a view on the db to push some work onto that rather than select in code?

I am a little puzzled however by your middle_consumption function. The inner loop contents do something like:

get a date, x years ago from present day
get a reading on that date, or 0 on failure
add that reading to the results
go through the results
    if the current item is 0, delete the **first** item


This seems wrong.


What happens on February 29th? It would be better to add 365 days if that's appropriate for your application.
Why add a value only to (presumably want to) delete it again?  Would something like this be better?

try:
    current_value = Reading.objects.get(
        date = date_of_reading,
        meter = self.meter,
        code = self.code
    ).consumption
except Reading.DoesNotExist: # or suitable exception
    current_value = 0
if current_value &gt; 0:
    anniversary_values.append( current_value )