Получить всю информацию о 1 QueryDjango

Я пытаюсь получить все значения в одном наборе запросов, у меня есть следующая модель:

class Temporal(model.Models):
   id = models.UUIDField(default=uuid.uuid4, primary_key=True)
   value=models.CharField(max_length=60)
   created_at = models.DateTimeField(auto_now_add=True)
   date_start = models.DateTimeField(auto_now_add=True)
   date_end = models.DateTimeField(auto_now_add=True)
   rate_name = models.ForeignKeyField("RateName")
   concept_payment = models.CharField(max_length=60)

   order = models.IntegerField(null=True, blank=True)

и некоторые другие поля...

Я получаю все diferente concept_payment таким образом:

 energy_concepts = Temporal.objects.filter(rate_name=rate_name,
                                                  date_start__month__lte=month_apply,
                                                   date_end__month__gte=month_apply,
                                                   concept_payment='Energy').first()

demand_concepts = Temporal.objects.filter(rate_name=rate_name,
                                               date_start__month__lte=month_apply,
                                               date_end__month__gte=month_apply,
                                               concept_payment='Demand').first()

other_concepts = Temporal.objects.filter(rate_name=rate_name,
                                              date_start__month__lte=month_apply,
                                              date_end__month__gte=month_apply,
                                              concept_payment='Others').first()

taxes_concepts = Temporal.objects.filter(rate_name=rate_name,
                                              date_start__month__lte=month_apply,
                                              date_end__month__gte=month_apply,
                                              concept_payment='Taxes').first()

и так далее, где единственным различием является concept_payment, Поэтому мне интересно, есть ли способ получить их все, используя annotate вместо того, чтобы получать по одному, concept payment являются динамическими, поэтому я думаю, что мне придется сначала получить все различные концетпы. Заранее спасибо

Вы можете использовать django in_bulk, чтобы получить словарь с concept_payment в качестве ключа и экземпляром Temporal в качестве значения.

Это будет непросто, поскольку на один экземпляр concept_type может приходиться более одного экземпляра, но поскольку вы используете postgres и сказали, что неважно, какой экземпляр возвращается, вы можете использовать distinct с concept_payment для удаления дубликатов.

Попробуйте с:

Temporal.objects.filter(
    rate_name=rate_name,
    date_start__month__lte=month_apply,
    date_end__month__gte=month_apply,
    concept_payment__in=['Taxes', 'Others', 'Demand', 'Energy'],
).distinct('concept_payment').in_bulk(field_name='concept_payment')

Это должно вернуть что-то вроде:

{
    'Taxes': '<Temporal object with Taxes concept_type>',
    'Demand': '<Temporal object with Demand concept_type>',
    'Energy': '<Temporal object with Energy concept_type>',
    'Others': '<Temporal object with Others concept_type>',
}

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