我有一个带有自定义方法的模型。这是一个例子:
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)
我怎么能解决这个问题?谢谢!
答案 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。但是,这不能像查询集一样链接。