Django QuerySet在脚本中进行堆栈过滤

时间:2015-11-11 09:51:17

标签: python django django-queryset

我有一个只需要根据特定用户提供的条件以某种方式过滤的查询集。

        # 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 *

导入所有内容,因为我在脚本中也有查询到同一个数据库(但是不同的表),这些查询完全正常,所以我相对确定它不是导入问题。

2 个答案:

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

感谢所有试图提供帮助的人,我希望这对遇到同样问题的人有用。