模型中的字段在内部“未定义”对象.过滤器()

2024-05-16 09:59:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的模型中,我有一个名为“expire\u date”的日期字段。我有一个查询模型的函数:

def date_delta_days(earlier_date, later_date):
    return (later_date - earlier_date).days

class Command(BaseCommand):
    help = """ Manages list expiration.  If lists are expiring soon, sends an email warning the list owners
               If a list has expired, the .pck file associated with that list is deleted
           """

    def handle(self, *args, **options):
        now = datetime.now()
        expiring_lists = ListEntry.objects.filter(
            date_delta_days(now, expire_date) # <------ error is on this line
        )

当我写这篇文章时,我得到一个语法错误,声称过期日期是无法识别的,即使它在我的ListEntry模型中被定义为一个字段。我有什么遗漏吗?这似乎是一个用SQL编写的简单查询。

以下是我的模型定义:

^{pr2}$

以下是相关的错误代码:

File "/home/jared/projects/list_expiration/list_app/management/commands/check_lists.py", line 19, in handle
    date_delta_days(now, expire_date)
NameError: global name 'expire_date' is not defined

Tags: 模型dateifisdefdaysnowlists
1条回答
网友
1楼 · 发布于 2024-05-16 09:59:11

在过滤器中,传递一个位置参数-可能是一个timedelta,它是从time_delta_days返回的。在该函数中,您使用两个变量:datetime对象,由返回日期时间。日期时间。现在()和。。。这是你问题的原因。您将传递一个名为expiration\u date的变量,该变量很可能在该点未定义。在

您可能希望使用命名参数,因为这正是filter()的工作原理。因为日期时间字段是可比较的,所以可以使用关键字(以及其他受支持的逻辑运算符)。您要查找从现在起不到30天内过期的ListEntry对象,然后使用:

month_from_now = datetime.datetime.now() + datetime.timedelta(days=30)
ListEntry.objects.filter(expiration_date__lt=month_from_now,
                         expiration_date__gt=datetime.datetime.now())

我添加了第二个filter参数,以确保您没有看到已经过期的ListEntry对象。您可以轻松地根据您的需要调整此代码。在

相关问题 更多 >