使用admin Django插入数据后插入表格

时间:2016-04-08 18:46:32

标签: django django-admin

我是Django的新手......

我将数据插入表中,然后使用django admin将其称为Bet表。 (即:投注我做的,场地是比赛日期,结果,我打赌多少,如果我赢了或输了赌注等等)。 但是,我也想知道,在每个月末,我赢了多少游戏,丢失了多少,我赚了多少钱等等。所以我创建了MonthBets表。我想做的是类似于数据库触发器:每当我向Bet表添加一个赌注,使用django-admin,我想在MonthlyBets表中添加我所获得的利润,如果我赢了或不,等等

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

最好的方法是不要创建MonthlyBets。您可以通过计算从您的投注模型获得月度记录,例如第2部分(重命名为投注到提示)。
第1节
如果您坚持创建MonthlyBets模型,则可以覆盖Django Admin save method。或者听听Bet模型的post_save signal。如果创建了新的Bet对象,请更新MonthlyBets。

第2节 它不是非常简单的代码,但它会为Tip模型每个月计算YieldCountWin 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()