Glitchmorphosis
@Glitchmorphosis

Как выполнить агрегатную функцию в prefetch_related?

Вот такие модели есть:
class ObjectDataAdditional(models.Model):
    percentage_technical_readiness = models.FloatField(
        null=True,
    )
    #какие-то поля


class ObjectDataNormalized(models.Model):
    #какие-то поля


class NormalizedAdditional(models.Model):
    normalized_object = models.ForeignKey(
        ObjectDataNormalized,
        on_delete=models.CASCADE,
        null=True,
        related_name='normal_object',
    )
    additional_object = models.ForeignKey(
        ObjectDataAdditional,
        on_delete=models.CASCADE,
        related_name='additional_object',
        null=True,
    )


class LinkedData(models.Model):
    many = models.ManyToManyField(
        ObjectDataNormalized,
        related_name='many_related',
    )


class LinkedInfo(models.Model):
    linked_data = models.ForeignKey(
        LinkedData,
        on_delete=models.CASCADE,
        related_name='linked_data_related'
    )
    normalized = models.ForeignKey(
        ObjectDataNormalized,
        on_delete=models.CASCADE,
        related_name='normalized_related'
    )
    main = models.BooleanField(
        default=False,
        null=False,
    )


У одного объекта ObjectDataNormalized может быть несколько ObjectDataAdditional. Все привязка идет в NormalizedAdditional.

Мне нужно получить данные из всех перечисленных таблиц. Так я это пытаюсь сделать:
prefetch = Prefetch('normalized__normal_object',  queryset=NormalizedAdditional.objects.
annotate(max_percentage=Max('additional_object__percentage_technical_readiness')))

info = LinkedInfo.objects.all().order_by('linked_data_id',
                                                 '-main').select_related(
            'linked_data',
            'normalized',
        ).prefetch_related(prefetch)


Все вроде работает. Из info могу вытащить данные из LinkedInfo, linked_data, normalized а вот получить значение percentage_technical_readiness я не могу. Много как пробовал вытащить это значение на самом деле.

То-есть в таблице NormalizedAdditional у одного объекта normalized_object может быть несколько ObjectDataAdditional:
normalized_object_id	additional_object_id
8	                                6580
8	                                6579
9	                                11006
9	                                10999

И мне нужно вытащить максимальное значение percentage_technical_readiness для объекта normalized_object. Поле percentage_technical_readiness находится в таблице ObjectDataAdditional.

Или может Django ORM не подходит для таких сложных запросов? Может в таких случаях лучше хранимые процедуры использовать?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Попробуйте Prefetch(qs)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы