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: Не помогло

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