Я хочу использовать свойство в качестве обычного поля модели в 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)