Оптимизация Django View для эффективной работы с большими массивами данных

Мне нужен совет по оптимизации представления Django для повышения его производительности, особенно при работе с большим количеством клиентов в базе данных. Вот сценарий:

У меня есть представление на Django под названием tClients, которое получает данные клиента и отображает их на веб-странице. Представление выполняет фильтрацию на основе параметра запроса status. Если параметр status задан и находится в пределах определенных значений, представление соответствующим образом фильтрует клиентов.

Вот текущая реализация представления:

@login_required(login_url='/accounts/login')
def tClients(request):
    client_Form = NewClient()
    client_update_form = ClientUpdateForm()

    filter_status = request.GET.get('status', None)

    if filter_status is not None and filter_status in ['-1', '0', '1']:
        clients = Client.objects.select_related()
        # values('id','nni','nom','date','telephone','address','observation')


        clients = [client for client in clients if client.is_debt == int(filter_status)]
    else:
        clients = Client.objects.values('id','nni','nom','date','telephone','address','observation')

    context = {
        'client_Form': client_Form,
        'client_update_form': client_update_form,
        'tClients': clients,
    }

    return render(request, 'clients/list_clients.html', context)

Модель Client определяется следующим образом:


class Client(models.Model):
    nni = models.CharField(max_length=20, verbose_name=_('nni'), unique=True)
    uid = models.CharField(max_length=500)
    nom = models.CharField(max_length=255, verbose_name=_('nom'))
    date = models.DateField(verbose_name=_("date  d'inscription"))
    img = models.ImageField(upload_to='client/qrcodes', blank=True, null=True, verbose_name=_("Image"))
    telephone = models.CharField(max_length=255, null=True, verbose_name=_("Telephone"))
    address = models.CharField(null=True, max_length=255, verbose_name=_("Address"))
    observation = models.TextField(null=True, verbose_name=_("Observation"))
    user = models.ForeignKey(User, blank=True, on_delete=models.SET_NULL, null=True)

    @property
    def is_debt(self):
        current_date = timezone.localdate()
        debts = self.client_detter.all()
        if debts.exists():
            for debt in debts:
                duration = current_date - debt.date_dette
                duration_in_days = duration.days
                if duration_in_days >= debt.dette_duration and debt.amount != debt.dette_montant_payee:
                    return -1
                elif duration_in_days < debt.dette_duration and debt.amount != debt.dette_montant_payee:
                    return 0
            return 1
        else:
            return 1

Изначально я пытался повысить производительность запроса, используя метод values для выбора только обязательных полей. Однако при попытке отфильтровать результаты на основе параметра status я столкнулся с проблемой.

Поскольку значения возвращают словарь, я не мог напрямую обратиться к свойству is_debt, которое определено как @property в модели Client.

Дополнительно я попробовал аннотировать queryset свойством is_debt, но, к сожалению, это не дало желаемых результатов.

Может ли кто-нибудь подсказать, как оптимизировать этот запрос. Спасибо .

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