模型中的字段在objects.filter()中是'undefined'

时间:2014-05-09 19:10:54

标签: python django

在我的模型中,我有一个名为' expire_date'的DateField。我有一个查询我的模型的函数:

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
        )

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

这是我的模型定义:

class ListEntry(models.Model):
    name = models.CharField(max_length=64)
    # active_date = models.DateTimeField('date of last list activity')
    expire_date = models.DateField('date of expiration')
    create_date = models.DateField('date created')


    class Meta:
        ordering = ('name',)

以下是相关的错误代码:

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

1 个答案:

答案 0 :(得分:2)

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

您可能想要做的是使用命名参数,因为这是 filter()的工作原理。由于日期时间字段具有可比性,因此您可以使用 __ gt __ lt 关键字(以及其他受支持的逻辑运算符)。您想要找到 ListEntry 对象,这些对象将在不到30天后过期,然后使用:

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())

我添加了第二个过滤器参数,只是为了确保您没有查看已经过期的 ListEntry 对象。您可以根据需要轻松调整此代码。