【问题标题】:Django QuerySet stack filters in script脚本中的 Django QuerySet 堆栈过滤器
【发布时间】:2023-03-09 06:17:01
【问题描述】:

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

        # 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 脚本中(而不是解释器),但我收到“未定义名称”错误。一些搜索表明它可能是声明错误

    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)

是第一个,错误将指向未定义'距离'的那一行。我试过改变顺序,例如放

   queryset = queryset.filter(unix_time <= endtime)

首先。但我得到了同样的错误,但这次 'unix_time' 没有定义

我已经仔细检查了这些名称,它们都是正确的。我正在使用

   from .models import *

导入所有内容,因为我在脚本中也有查询访问相同的数据库(但不同的表),它们工作得非常好,所以我相对确定这不是导入问题。

【问题讨论】:

  • 我可以看看你的 models.py 声明吗?
  • 什么名称未定义?与 Python 中的任何东西一样,您需要先导入一个东西才能使用它;这与 Django 或在脚本中执行此操作无关。
  • 请从您的标题中删除“已解决”并发布您自己的解决方案作为正确答案。

标签: python django django-queryset


【解决方案1】:

您需要输入queryset = Spot.objects 而不是queryset = Spot.objects.values() 您还需要导入您的Spot model,以防您尚未这样做。

【讨论】:

  • 试过了。仍然得到同样的错误。不确定 Spot.objectsSpot.objects() 之间是否有区别。我使用的是 from .models import * ,并且我在同一个数据库上有其他查询可以正常工作,所以我很确定这不是导入问题。
【解决方案2】:

已解决

所以我终于弄清楚出了什么问题。显然,filter() 不能识别标准的比较运算符,如 >= 和

相反,它使用字段查找来模拟 SQL WHERE 子句。所以不是

queryset = queryset.filter(unix_time >= starttime)

我应该这样做

queryset = queryset.filter(unix_time___gte = starttime)

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

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 2021-06-16
    • 2013-09-08
    • 2018-10-09
    • 2011-03-04
    • 2021-05-13
    • 2016-03-22
    • 2016-07-21
    • 2020-12-24
    相关资源
    最近更新 更多