Because I don't know much about GeoDjango, and I don't exactly how the database that you're using handles it on the back-end, I can't say for sure that it's more efficient than looping through all of the models, but the distance_lte function seems to be the sort of function that you're looking for. I'd imagine that the database would handle it as efficiently as reasonably possible.http://docs.djangoproject.com/en/1.3/ref/contrib/gis/geoquerysets/#distance-lte
Of course, the fact that every order has its own maximum distance makes it difficult... So, what I would do is enforce a "maximum" maximum distance, then use the function to limit your loop to those within that "maximum" distance.
So, for example, if the choice for maximum distance was <30 mi, then you take your point, find all the orders within 30 mi of the point using the function, and then loop to filter out the ones that are too far away. There might be an easier way to do this, but that's the best way I can find at the moment.