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

按属性筛选

/ 猿问

按属性筛选

侃侃无极 2019-10-11 10:40:26

是否可以通过模型属性过滤Django查询集?


我的模型中有一个方法:


@property

def myproperty(self):

    [..]

现在我想按此属性进行过滤,例如:


MyModel.objects.filter(myproperty=[..])

这有可能吗?


查看完整描述

3 回答

?
海绵宝宝撒

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


查看完整回答
反对 回复 2019-10-11
?
幕布斯7119047

我可能会误解您的原始问题,但是python中内置了一个过滤器。


filtered = filter(myproperty, MyModel.objects)

但是最好使用列表理解:


filtered = [x for x in MyModel.objects if x.myproperty()]

甚至更好的是生成器表达式:


filtered = (x for x in MyModel.objects if x.myproperty())


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

看起来将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

添加回答

回复

举报

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