按属性筛选

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


我的模型中有一个方法:


@property

def myproperty(self):

    [..]

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


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

这有可能吗?


侃侃无极
浏览 828回答 3
3回答

海绵宝宝撒

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

慕慕森

看起来将F()与批注一起使用将是我的解决方案。它不会被过滤@property,因为F在将对象带入python之前会与数据库进行对话。但是仍然把它作为答案,因为我想要按属性过滤的原因实际上是想通过对两个不同字段进行简单算术的结果来过滤对象。因此,类似以下内容:companies = Company.objects\    .annotate(chairs_needed=F('num_employees') - F('num_chairs'))\    .filter(chairs_needed__lt=4)而不是将属性定义为:@propertydef chairs_needed(self):    return self.num_employees - self.num_chairs然后对所有对象进行列表理解。
打开App,查看更多内容
随时随地看视频慕课网APP