Django - Аннотирование кверисета результатом функции
Я пытаюсь взять кверисет и аннотировать его так, чтобы значение нового поля было результатом функции, которая требует аннотируемого объекта. В данном случае я беру кверисет автомобилей и аннотирую его значением расстояния до автомобиля, которое вычисляется функцией.
Основная проблема, с которой я сталкиваюсь, заключается в том, чтобы аннотации были уникальными для каждого автомобиля, а не массовыми аннотациями. Я попробовал большинство подходов, упомянутых здесь, но, похоже, ни один из них не работает.
Ближе всего я подошел к этому моменту, используя подход с использованием Unions, это позволило получить аннотации, однако моим следующим шагом будет упорядочивание этого Queryset, поэтому мне нужно иметь возможность сделать это без потери аннотаций.
Для контекста: car - объект Car, distances - словарь расстояний. Unannotated изначально устанавливается на кверисет автомобилей, к которым уже может быть применена аннотация из предыдущей функции.
Решение Союза, которое я нашел, следующее:
for car in unannotated:
annotated = unannotated.filter(id=car.id).annotate(distance=Value(get_distance_of_car_from_distances(distances, car)))
clean = clean.union(annotated)
Однако, как уже говорилось ранее, это вызвало проблемы с дальнейшим шагом упорядочивания.
Я также попробовал следующее решение
for car in unannotated:
unannotated = unannotated.filter(id=car.id).annotate(distance=Value(get_distance_of_car_from_distances(distances, car)))
Однако, как только я пытаюсь просмотреть новое поле, я получаю AttributeError: 'NoneType' object has no attribute 'distance'
Я также попробовал следующее решение:
unannotated = unannotated.annotate(distance=Value(0))
for car in unannotated:
print(car.distance)
car.distance = get_distance_of_car_from_distances(distances, car)
car.save()
Однако это ничего не дает, так как все расстояния по-прежнему равны 0.
Следующим шагом в моей программе будет упорядочивание Queryset, поэтому метод Union, вероятно, не лучший способ, если только нет способа обойти это, и я хотел бы сохранить любую существующую аннотацию, если это возможно.
Простите, если получилось длинно, я решил, что лучше больше, да лучше.