Переопределение метода django admin get_queryset - PullRequest
1 голос
/ 16 января 2020

У меня есть следующая django модель:

class HeartbeatCell(Model):

    area_id = models.ForeignKey(Area, on_delete=model.DELETE)
    entry_time = models.DateTimeField()
    exit_time = models.DateTimeField()
    cell_id = models.IntegerField()

И я хочу иметь страницу администратора, но хочу запретить django загружать всю таблицу, когда пользователь впервые заходит на эту страницу администратора Так как эта таблица довольно большая. Таким образом, я переопределяю метод 'get_queryset' в классе модели администратора, где я хочу ограничить столбцы 'entry_time' и 'exit_time' интервалом, эквивалентным [сейчас - X секундам, сейчас] в случае, если пользователь не выполняет поиск что включает в себя любое условие на упомянутых столбцах.

Я использую DjangoQLSearchMixin , который позволяет выполнять следующие поиски в любом поле модели: =,>,> =, <, <=, in. Они переводятся django способом в GET Параметры url: =, __gt, __gte, ... </p>

Мне пришла в голову мысль, что request.GET выдает словарь в виде строк: "{'entry_time__gte': '2020-01-16 00:00 ',' cell_id ': 52} "и, таким образом, я попробовал следующее:

    def get_queryset(self, request):
    """Overrides default queryset."""

        qs = super(HeartbeatCellAdmin, self).get_queryset(request)


        for param,value in request.GET.items():
            if 'entry_time' in param:
                return qs

        return qs.filter(entry_time__gte=pendulum.now('UTC') - timedelta(
            seconds= 300))

Приведенный выше код не работает, т. е. результаты поиска не верны, и я пробовал еще пару варианты но все безуспешно. Кто-нибудь знает, как это решить?

1 Ответ

0 голосов
/ 16 января 2020

Этот блок else бесполезен. Измените свой код на это:

def get_queryset(self, request):
    """Overrides default queryset."""

    qs = super(HeartbeatCellAdmin, self).get_queryset(request)


    for param,value in request.GET.items():
        if 'entry_time' in param:
            return qs

    return qs.filter(entry_time__gte=pendulum.now('UTC') - timedelta(
        seconds=HeartbeatCellAdmin.default_secs_past))
...