Использовать свойство модели как обычное поле в фильтре наборов запросов - PullRequest
0 голосов
/ 06 мая 2019

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