Оптимизация 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
, но, к сожалению, это не дало желаемых результатов.
Может ли кто-нибудь подсказать, как оптимизировать этот запрос. Спасибо .