为了账号安全,请及时绑定邮箱和手机立即绑定

按属性筛选

按属性筛选

侃侃无极 2019-10-11 10:40:26
是否可以通过模型属性过滤Django查询集?我的模型中有一个方法:@propertydef myproperty(self):    [..]现在我想按此属性进行过滤,例如:MyModel.objects.filter(myproperty=[..])这有可能吗?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

不。Django过滤器在数据库级别运行,生成SQL。要基于Python属性进行过滤,您必须将对象加载到Python中以评估该属性-到那时,您已经完成了加载该对象的所有工作。


查看完整回答
反对 回复 2019-10-11
?
慕慕森

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

然后对所有对象进行列表理解。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 819 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信