我是Django的新手......
我将数据插入表中,然后使用django admin将其称为Bet表。 (即:投注我做的,场地是比赛日期,结果,我打赌多少,如果我赢了或输了赌注等等)。 但是,我也想知道,在每个月末,我赢了多少游戏,丢失了多少,我赚了多少钱等等。所以我创建了MonthBets表。我想做的是类似于数据库触发器:每当我向Bet表添加一个赌注,使用django-admin,我想在MonthlyBets表中添加我所获得的利润,如果我赢了或不,等等
最好的方法是什么?
答案 0 :(得分:1)
最好的方法是不要创建MonthlyBets。您可以通过计算从您的投注模型获得月度记录,例如第2部分(重命名为投注到提示)。
第1节
如果您坚持创建MonthlyBets模型,则可以覆盖Django Admin save method。或者听听Bet模型的post_save signal。如果创建了新的Bet对象,请更新MonthlyBets。
第2节
它不是非常简单的代码,但它会为Tip模型每个月计算Yield
,Count
和Win Ratio
。
for date in Tip.objects.datetimes('date_game', 'month', order='DESC'):
date_filter['date_game__month'] = date.month
date_filter['date_game__year'] = date.year
date_yield, date_count, date_win = get_yield(date_filter)
month_list.append({"month": date, "yield": date_yield,
"count": date_count,
"win": date_win})
在utils.py
中或在你保持逻辑的任何地方都是这样的。
from django.db.models import Sum, F
from django.db import models as db_models
def get_yield(filter={}):
"""
@kwargs filter options = date_game__month=month, date_game__year=year, sport__name=sport, etc
:return: yield, all_tips_count, win_tips_count
http://stackoverflow.com/questions/12165636/django-aggregation-summation-of-multiplication-of-two-fields
"""
win_sum = Tip.objects.filter(result=Tip.WIN, **filter).aggregate(total=Sum(F('odds')*F('stake'),
output_field=db_models.DecimalField()))['total']
if win_sum==None:
win_sum=0
stake_sum = Tip.objects.filter(result__in=[Tip.WIN, Tip.LOST], **filter).aggregate(total=Sum('stake'))['total']
if stake_sum==None:
return 0, Tip.objects.filter(result__in=[Tip.WIN, Tip.LOST], **filter).count(),\
Tip.objects.filter(result__in=[Tip.WIN], **filter).count()
return (win_sum-stake_sum)/stake_sum * 100,\
Tip.objects.filter(result__in=[Tip.WIN, Tip.LOST], **filter).count(),\
Tip.objects.filter(result__in=[Tip.WIN], **filter).count()