Индексация модели по полю Choice в django
У меня есть модель, которая имеет поле статуса поля выбора, которые являются ожидающими, одобренными, отмененными, отклоненными. Я индексирую поле status в моей модели и makemigrations, но индекс работает только для других значений, но не для approved. Если я фильтрую по другим статусам, например, pending, cancel, он покажет, что он получает его из индекса, но если я фильтрую по approved, он не работает, и он загружается медленно. Хотя набор данных модели очень большой, около 7 миллионов.
Я получаю данные из инструментов отладки django Это будет показано, если я отфильтрую по другим значениям если я фильтрую по другим значениям если я фильтрую по утвержденному значению
вот мое представление, которое я использую для тестирования фильтра
def testing(request): context['response'] = Task_Submitted.objects.filter(status='approved') return render(request, 'testing.html', context)
моя модель
Tasks_submitedstatus = [
('pending','PENDING'),
('rejected','REJECTED'),
('approved','APPROVED'),
('cancel','CANCEL')
]
class Task_Submitted(models.Model):
status = models.CharField(choices=Tasks_submitedstatus, help_text='Status', null=True, max_length=8, db_index=True)
есть ли способ исправить это, чтобы одобренные тоже были в индексе, так что если я отфильтрую по одобренному значению тоже, он будет загружаться быстрее
Я бы посоветовал не записывать approved
или cancelled
в базу данных. А работать с короткой строкой. Это не только сэкономит дисковое пространство, но и облегчит фильтрацию по этому столбцу благодаря хешированию и небольшим индексам.
We can thus work with:
class Task(models.Model):
STATUSSES = [
('p', 'pending'),
('a', 'approved'),
('c', 'cancelled'),
('r', 'rejected'),
]
status = models.CharField(max_length=1, db_index=True, choices=STATUSSES)
# …
В представлении мы передаем Task
объекты, не :.values()
def testing(request):
return render(
request, 'testing.html', {'response': Task.objects.filter(status='a')}
)
и мы можем отобразить в шаблоне с:
{% for task in response %}
{{ task.get_status_display }}
{% endfor %}
Таким образом, "одобрено", не "a".