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

にフィルターを追加する必要があります。これは、メインのSQL式most_lovedmost_hated同等active=TrueのSQLになります。where active=true

それを行う方法についての手がかりはありますか?

4

1 に答える 1

1

extra()おそらく、(関数を置き換えるために) SQL ビューを記述し、ビュー用に新しいアンマネージド モデルを作成する必要があると思います (モデル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')
于 2013-02-20T14:50:15.187 に答える