Django/Python:如何使用模型的自定义方法进行过滤?可以吗?
我有一个模型,里面有一个自定义的方法。下面是个例子:
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
你的超时测试其实很简单,可以用查询集的过滤器来重新实现。
如果你遇到一个非常复杂的测试,无法用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的条件。不过,这种方式不能像查询集那样进行链式调用。
2
你不能在你的模型上使用自定义的方法来进行过滤,因为过滤器会被转换成SQL语句,而用一些Python代码是无法做到这一点的。不过,下面的内容应该能解决你的问题:
import datetime
queryset = MyModel.objects.filter(\
time_created__lt=(datetime.now()-datetime.timedelta(minutes=3)))