У меня есть три модели:
class Calendar(models.Model):
...
supplier = models.CharField(...)
subassort = models.CharField(..., null=True)
class SupplierProductAssortments(models.Model):
subassort = models.CharField(...)
supplier = models.CharField(...)
ui2_code = models.CharField(...)
class UI2(models.Model):
code = models.CharField(...)
name = models.CharField(...)
Мне нужно к кверисету
Calendar.objects.all()
проаннотировать поле
ui2
, которое представляет собой
UI2.objects.values_list('name', flat=True)
. Для лучшего понимания, ниже представлена функция, которая делает, что нужно, но не оптимально (количество запросов равно количеству экземпляров
Calendar
):
def get_calendars_with_ui2s():
calendars = Calendar.objects.all() # neet to annotate ui2 names
for calendar in calendars:
if subassort := calendar.subassort:
ui2_codes = SupplierProductAssortments.objects\
.filter(supplier=calendar.supplier, subassort=subassort)\
.values_list('ui2_code', flat=True)
ui2 = UI2.objects.filter(code__in=ui2_codes).values_list('name', flat=True)
else:
ui2 = []
calendar.ui2 = ui2
return calendars
Предположу, что если бы фильтрация при получении
ui2_codes
была бы по одному полю, то можно было решить задачу при помощи
OuterRef
.
Как мне проаннотировать
ui2
?