Индексация модели по полю 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".

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