我有一个只需要根据特定用户提供的条件以某种方式过滤的查询集。
# construct the base queryset first
queryset = Spot.objects.values()
# zero is the default value,
# so only need to filter if an actual value is provided
if mindist > 0:
queryset = queryset.filter(distance >= mindist)
if maxdist > 0:
queryset = queryset.filter(distance <= maxdist)
if starttime != 0:
queryset = queryset.filter(unix_time >= starttime)
if endtime != 0:
queryset = queryset.filter(unix_time <= endtime)
objects_list = list(queryset)
return objects_list
基本上,我试图复制Django文档中提到的功能https://docs.djangoproject.com/en/1.8/topics/db/queries/#querysets-are-lazy
但条件和.py脚本(而不是解释器)内,但我得到一个&#39;名称未定义&#39;错误。一些搜索表明它可能是
的声明错误 queryset = Spot.objects.values()
所以我已尝试使用其他变种,例如
queryset = Spot.objects.filter()
queryset = Spot.objects.all()
queryset = Spot.objects()
但它们似乎都不起作用。
编辑:这是我的models.py
class Spot(models.Model):
spot_id = models.IntegerField(db_column='Spot_ID', primary_key=True) # Field name made lowercase.
unix_time = models.IntegerField(db_column='UNIX_time', blank=True, null=True) # Field name made lowercase.
distance = models.IntegerField(db_column='Distance', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'SPOT'
进一步澄清。对于在最初的Spot.objects.values()之后出现的任何过滤器,都会出现错误。例如,在上面的那个,
queryset = queryset.filter(distance >= mindist)
是第一个,错误将指向&#39;距离&#39;未定义。我尝试过切换订单,例如把
queryset = queryset.filter(unix_time <= endtime)
首先是。但是我得到了同样的错误,但这次是用&#39; unix_time&#39;未定义。
我仔细检查过这些名字,但他们都是正确的。我正在使用
from .models import *
导入所有内容,因为我在脚本中也有查询到同一个数据库(但是不同的表),这些查询完全正常,所以我相对确定它不是导入问题。
答案 0 :(得分:0)
您需要Everyone
而不是queryset = Spot.objects
如果您还没有这样做,还需要导入queryset = Spot.objects.values()
。
答案 1 :(得分:0)
<强>解决强>
所以我终于弄清楚出了什么问题。显然,filter()无法识别标准比较运算符,如&gt; =和&lt; =。
相反,它使用Field Lookups来模拟SQL WHERE子句。而不是
queryset = queryset.filter(unix_time >= starttime)
我应该做
queryset = queryset.filter(unix_time___gte = starttime)
感谢所有试图提供帮助的人,我希望这对遇到同样问题的人有用。