我有以下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))
上面的代码不起作用,即搜索结果不正确,我尝试了更多的选择,但都失败了。有人知道如何解决吗?
答案 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))