我想在filter
中使用属性作为普通模型字段,以减少代码重复。
我想要得到什么:
class SomeModel(models.Model):
# ...
@property
def is_active(self):
# some query e.g.:
return self.some_related.filter(some_complex_query).exists()
SomeModel.objects.filter(is_active=True)
有可能吗?
我知道我可以覆盖manager
并以另一种方式来做:SomeModel.objects.filter_active(True)
。但这并不像第一个示例那么好。
更新:当前实现
class SomeManager(models.Manager):
def with_is_active(self):
return self.annotate(is_active='some query')
class SomeModel(models.Model):
objects = SomeManager()
# ...
@property
def is_active(self) -> bool:
raise ValueError('Use SomeModel.objects.with_is_active()!')
SomeModel.objects.with_is_active().filter(is_active=True)