Получить всю информацию о 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>',
}