覆盖django admin get_queryset方法

时间:2020-01-16 15:59:56

标签: django django-admin

我有以下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”列的间隔限制为等于[now-X seconds,now],以防用户不进行搜索其中包括上述列中的任何条件。

我正在使用DjangoQLSearchMixin,它允许在任何模型字段中进行以下搜索:=,>,> =,<,<=,in。这些以Django方式转换为GET url参数:=,__ gt, __gte,...

我的想法是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 :(得分:0)

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))