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, вероятно, не лучший способ, если только нет способа обойти это, и я хотел бы сохранить любую существующую аннотацию, если это возможно.

Простите, если получилось длинно, я решил, что лучше больше, да лучше.

Вернуться на верх