Django - Как объединить два набора запросов с разными значениями ключей (но из одной модели) - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь объединить два набора запросов в Django с разными значениями ключа, но из той же модели, есть ли способ сделать это?

Вот мой код:

models.py

class CustomerInformation(models.Model):
    status = (
        ('lead', 'Lead'),
        ('client', 'Client'),
    )

    customer_id = models.AutoField(primary_key=True)
    customer_name = models.CharField(max_length=100)
    status = models.CharField(max_length=100, choices=status, default='lead')
    conversion_date = models.DateField(null=True, blank=True)
    created_date = models.DateField(default=timezone.localdate)


def save(self, *args, **kwargs):
        if self.customer_id:
            if self.status != CustomerInformation.objects.get(customer_id=self.customer_id).status and self.status == 'client':
                self.conversion_date = timezone.now()
            elif self.status != CustomerInformation.objects.get(customer_id=self.customer_id).status and self.status == 'lead':
                self.conversion_date = None
        super(CustomerInformation, self).save(*args, **kwargs)

вот моя фильтрация

start = date.today() + relativedelta(days=-30)

client_qs = CustomerInformation.objects.filter(conversion_date__gte=start).values(date=F('conversion_date')).annotate(client_count=Count('date'))
lead_qs = CustomerInformation.objects.filter(created_date__gte=start).values(date=F('created_date')).annotate(lead_count=Count('date'))

По сути, я пытаюсь получить количество экземпляров CustomerInformation, созданных за последние 30 дней (путем аннотирования количество поля created_date). Кроме того, я хочу получить количество экземпляров CustomerInformation, которые преобразовались в статус «клиент» в течение последних 30 дней (путем аннотирования счетчика поля «conversion_date»). Есть ли способ сделать это и получить их в одном наборе запросов, желательно с одним полем даты?

Например, мой желаемый результат будет

[ {'date': '170620', 'lead_count': 2, 'client_count': 1}, {'date': '180620', 'lead_count': 1, 'client_count': 0 }, ... ]

Любая помощь приветствуется, всем спасибо!

1 Ответ

0 голосов
/ 18 июня 2020

Я думаю, вы можете добиться того же, выполнив:

combined_qs = CustomerInformation.objects.filter(created_date__gte=start, conversion_date__gte=start).annotate(lead_count=Count('created_date'), client_count=Count('conversion_date')

Обратите внимание, что в приведенном выше примере будет использоваться AND фильтр. Грубо говоря, это означает, что он будет возвращать только информацию о клиентах, у которых и created_date, и conversion_date больше, чем date. (Я могу ошибаться, но я думаю, что это то, что вам нужно в данном случае).

В противном случае вы можно использовать объект Q для более сложного запроса.

from django.db.models import Q
combined_qs = CustomerInformation.objects.filter(Q(created_date__gte=start)|Q(conversion_date__gte=start)).annotate(lead_count=Count('created_date'), client_count=Count('conversion_date')

Официальный do c для использования объектов Q - здесь

Я скажу попробуйте оба и сравните полученные результаты.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...