Вот такие модели есть:
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 не подходит для таких сложных запросов? Может в таких случаях лучше хранимые процедуры использовать?