Возможно, вы захотите прочитать: Когда оцениваются QuerySets .
for product in products:
: здесь запрос gets evaluated
, т. Е. Данные находятся вне базы данных. После этого вы не сможете изменить порядок запроса.
В идеале вам следует повторить тот же запрос:
products = Product.objects.all()
for product in products:
product.update_exist_flag()
products = Product.objects.all().order_by('-exist_flag')
Однако есть один трюк, чтобы сделать это, не выполняя тот же запрос снова (не касаясь базы данных):
products = Product.objects.all()
for product in products:
product.update_exist_flag()
# This will return a list.
products = sorted(products, key=lambda p: p.exist_flag, reverse=True)
Как упомянуто в комментарии @heemayl, если exist_flag
является связанным объектом(запись в таблице в базе данных), затем он снова попадет в базу данных. В этом случае все же возможна одна оптимизация: if
, которую вы хотите отсортировать на основе id
в существующем_флаге, тогда мы можем использовать p.exist_flag_id
вместо p.exist_flag
, чтобы она не попала в базу данных.