Join к уже отфильтрованной и обработанной таблице Django
интересует решение задачи, а именно, Django по умолчанию использует INNER JOIN для работы с таблицей, у меня вопрос, можно ли как-то самому задать какой будет использоваться JOIN, и к какой таблице, ибо он автоматически это определяет а мне это важно задать JOIN к уже отфильтрованной таблице. Заранее спасибо за уделенное внимание.
Попробуйте это.
from django.db import models
from django.db.models import Sum, Count, Prefetch, F
class Segments(models.Model):
class Meta:
verbose_name_plural = 'Сегменты (Segments)'
title = models.CharField(max_length=32,
verbose_name='Название сегмента')
def __str__(self):
return self.title
# Вот нужный вам код
@classmethod
def gettest(cls):
qs = cls.objects.prefetch_related(
'client_set',
'client_set__orders_set',
).annotate(
sum_receipts=Sum(F('client__orders__receipts')),
sum_summa=Sum(F('client__orders__summa')),
count_clients=Count(F('client')),
)
for x in qs:
print(x, x.sum_receipts, x.sum_summa, x.count_clients)
# Конец
class Client(models.Model):
class Meta:
verbose_name_plural = 'Клиенты (Clients)'
fio = models.CharField(max_length=128, verbose_name='ФИО')
create_date = models.DateField(verbose_name='Дата создания')
distribution = models.BooleanField(verbose_name='Рассылка')
segment = models.ForeignKey(Segments,
on_delete=models.CASCADE,
verbose_name='Сегмент',
default=7)
def __str__(self):
return self.fio
class Orders(models.Model):
class Meta:
verbose_name_plural = 'Заказы (Orders)'
client = models.ForeignKey(Client,
on_delete=models.CASCADE,
verbose_name='Клиент')
receipts = models.PositiveSmallIntegerField(verbose_name='Кол-во чеков')
summa = models.FloatField(verbose_name='Сумма')
order_date = models.DateField(verbose_name='Дата заказа')
Segments.gettest()
Воможно нужно будет поправить опечатки.
Если не будет работать - заменить строки в Sum
и Count
на объекты F()
с этимиже строками как параметры, например Sum('client_set__orders_set__receipt') => Sum(F('client_set__orders_set__receipt'))
PS: Надеюсь поможет с первого трая
PPS: Не помогло