Django / Python:如何使用Model的自定义方法进行过滤?这可能吗?

时间:2010-11-11 18:36:10

标签: python django

我有一个带有自定义方法的模型。这是一个例子:

class MyModel(models)
   id = models.AutoField(primary_key=True)
   name = models.CharField(max_length=50)
   nickname = models.CharField(max_length=50)
   time_created = models.DateTimeField(auto_now_add=True)

   def sample_method(self)
       right_now = datetime.now()
       created_time = self.time_created
       time2compare = timedelta(minutes=3)

       timeout = True
       if(right_now - created_time) > time2compare:
           timeout = False
       return timeout

我正在做的是做这样的事情(我知道这不起作用)

queryset = MyModel.objects.filter(timeout = False)

我怎么能解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:2)

您不能在模型上使用自定义方法进行过滤,因为过滤器将被解析为看到sql,这对于某些python代码是不可能的。尽管如此,以下内容可以解决您的问题:

import datetime
queryset = MyModel.objects.filter(\
     time_created__lt=(datetime.now()-datetime.timedelta(minutes=3)))

答案 1 :(得分:0)

您的超时测试对于重新实现作为查询集过滤器非常简单。

对于无法在Django查询语言或原始SQL中表达的真正复杂的测试,您可以编写如下内容:

def sample_filter(self, method_name, arg=False)
    for i in self.objects.all():
        if getattr(self, method_name)() == arg:
            yield i

此方法将向模型的每个实例x返回一个迭代器,其中x.method_name()== arg。但是,这不能像查询集一样链接。