Как добавить фильтр в собственный менеджер?
Я застрял с добавлением фильтра в пользовательский менеджер в Django. Это мой текущий пользовательский менеджер, который работает:
class VoteAwareManager(models.Manager):
def _get_score_annotation(self):
model_type = ContentType.objects.get_for_model(self.model)
table_name = self.model._meta.db_table
return self.extra(select={
'active': 'select active from %s mh where mh.main_id = %s.id and mh.active = true and mh.date_begin = (select max(date_begin) from euvoudebicicletaengine_mainhistoric where main_id = mh.main_id) and mh.date_end >= now()' % (MainHistoric._meta.db_table, table_name),
'row_num': '(row_number() over(order by (SELECT COALESCE(SUM(vote / ((extract(epoch from now() - time_stamp )/3600)+2)^1.5),0) FROM %s WHERE content_type_id=%d AND object_id=%s.id) DESC))' % (Vote._meta.db_table, int(model_type.id), table_name), # To know the position(#number) on the front page
'score': 'SELECT COALESCE(SUM(vote / ((extract(epoch from now() - time_stamp )/3600)+2)^1.5),0) FROM %s WHERE content_type_id=%d AND object_id=%s.id' % (Vote._meta.db_table, int(model_type.id), table_name)
}
)
def most_loved(self,):
return self._get_score_annotation().order_by('-score')
def most_hated(self):
return self._get_score_annotation().order_by('score')
Мне нужно добавить фильтр к most_loved
а также most_hated
в active=True
это будет эквивалент SQL where active=true
в основном выражении sql.
Любые подсказки о том, как это сделать?
1 ответ
Я думаю, что вам, вероятно, нужно написать представление SQL (чтобы заменить extra()
функция) и создать новую неуправляемую модель для представления (включая active
как поле в вашей модели).
Как и в этом вопросе. Или этот (возможно, устаревший).
Тогда используйте вид в вашем _get_score_annotation
и добавьте фильтр в набор запросов, который вы получаете от этой функции.
def _get_score_annotation(self):
return ContentTypeView.objects.filter(# any filtering you need)
def most_loved(self,):
return self._get_score_annotation().filter(active=True).order_by('-score')