2013-02-20 3 views
1

Я застрял в добавлении фильтра к пользовательскому менеджеру в 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()) и создать новый вид unmanaged model для просмотра (в том числе active в качестве поля в вашей модели).

Как и в this вопрос. Или this (возможно, устаревший).

Затем используйте представление в своем _get_score_annotation и добавьте filter к запросу, которое вы получаете от этой функции.

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') 
+0

Hi Aidan. Спасибо за ответ. Добавление фильтра таким образом дает мне ошибку: «Невозможно разрешить ключевое слово« active »в поле. Варианты: ...». Похоже, я не могу использовать дополнительные поля в предложении WHERE. Любые подсказки о том, как это сделать по-другому? С наилучшими пожеланиями, –

+0

Хорошо, я вижу проблему (я думал, что это было немного прямолинейно). –

+0

Я обновил свой ответ. –

Смежные вопросы