是否可以通过模型属性过滤Django查询集?我的模型中有一个方法:@propertydef myproperty(self): [..]现在我想按此属性进行过滤,例如:MyModel.objects.filter(myproperty=[..])这有可能吗?
3 回答
海绵宝宝撒
TA贡献1809条经验 获得超8个赞
不。Django过滤器在数据库级别运行,生成SQL。要基于Python属性进行过滤,您必须将对象加载到Python中以评估该属性-到那时,您已经完成了加载该对象的所有工作。
慕慕森
TA贡献1856条经验 获得超17个赞
看起来将F()与批注一起使用将是我的解决方案。
它不会被过滤@property,因为F在将对象带入python之前会与数据库进行对话。但是仍然把它作为答案,因为我想要按属性过滤的原因实际上是想通过对两个不同字段进行简单算术的结果来过滤对象。
因此,类似以下内容:
companies = Company.objects\
.annotate(chairs_needed=F('num_employees') - F('num_chairs'))\
.filter(chairs_needed__lt=4)
而不是将属性定义为:
@property
def chairs_needed(self):
return self.num_employees - self.num_chairs
然后对所有对象进行列表理解。
添加回答
举报
0/150
提交
取消