メソッドを備えた次のモデルがあります。
class TrendingTopic(models.Model):
categories = models.ManyToManyField('Category', through='TTCategory', blank=True, null=True)
location = models.ForeignKey(Location)
def get_rank(self, t_date=None):
if t_date:
ttcs = self.trendingtopiccycle_set.filter(cycle_time__gt=t_date)
else:
ttcs = self.trendingtopiccycle_set.all()
if ttcs:
return sum([ttc.rank for ttc in ttcs])/len(ttcs)
return 0
def get_day_rank(self,t_date):
ttcs = self.trendingtopiccycle_set.filter(cycle_time__year=t_date.year,
cycle_time__month=t_date.month,
cycle_time__day=t_date.day)
sum_rank = sum([ttc.day_rank for ttc in ttcs if ttc.day_rank])
if sum_rank:
return sum_rank/len(ttcs)
return 0
class TrendingTopicCycle(models.Model):
tt = models.ForeignKey(TrendingTopic)
cycle_time = models.DateTimeField(default=datetime.now)
from_tt_before = models.BooleanField(default=False)
rank = models.FloatField(default=0.0)
day_rank = models.FloatField(default=0.0)
そして、必要な情報を取得するためにビューで使用される関数がいくつかあります。
その日の最高のトレンド トピックを表示します。
def day_topics(tt_date, limit=10): tts = [(ttc.tt, ttc.tt.get_day_rank(tt_date)) for ttc in \ TrendingTopicCycle.objects.distinct('tt__name') \ .filter(cycle_time__year=tt_date.year, cycle_time__month=tt_date.month, cycle_time__day=tt_date.day)] sorted_tts = sorted(tts, key=itemgetter(1), reverse=True)[:limit] return sorted_tts
指定された場所 (woeid) の最高のトレンド トピックを、指定された時間内に表示します。
def hot_topics(woeid=None, limit=10): CYCLE_LIMIT = datetime.now() + relativedelta(hours=-5) TT_CYCLES_LIMIT = datetime.now() + relativedelta(days=-2) if woeid: tts = [ttc.tt for ttc in \ TrendingTopicCycle.objects.filter(tt__location__woeid=woeid) \ .distinct('tt__name') \ .exclude(cycle_time__lt=CYCLE_LIMIT)] else: tts = [ttc.tt for ttc in \ TrendingTopicCycle.objects.distinct('tt__name') \ .exclude(cycle_time__lt=CYCLE_LIMIT)] sorted_tts = sorted(tts, key=lambda tt: tt.get_rank(TT_CYCLES_LIMIT), reverse=True)[:limit] return sorted_tts
現在のソリューションの問題は、データを取得するために多くのクエリ (100 の) を実行するため、実行が非常に遅くなることです。パフォーマンスの測定に役立つように、django デバッグ ツールバーを使用しています。
明らかに、私は何かひどく間違ったことをしており、解決策を探しています。どんな助けも大歓迎です。
編集:
各トレンド トピックには、一連のトレンド トピック サイクル (ttc) があります。各 ttc には、一般的なランク (ランク) と day_rank の 2 つのランクがあります。トレンド トピックのランクは、各 ttc をループして計算されます。