@albertalexandrov

Django — Как проаннотировать кверисет?

У меня есть три модели:

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?
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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