尝试在模板上显示由同一类上的另一个字段筛选的类字段的每个实例的总和.python django幻想体育



[幻想小队花名册页面截图]

我正试图建立一个梦幻体育网站。我有NBA球员(作为一个职业(通过球员职业上的一个字段分配给(django内置的(用户(梦幻球队(。我想汇总用户某一年的所有球员工资,并将其列在该用户(又名球队(的球员名册页面上(无论谁登录(

将Player类导入shell&django.db.models导入SumPlayer.objects.filter(Player_owner_exat='1'(.agregate(Sum('Player_sal_19_20'((

结果:{'player_sal_19_20__sum':十进制('89654339'(}

但我如何才能在幻想队的公开名单页面模板上获得这笔金额

我花了好几天时间尝试聚合函数,试图将它与我的get_queryset(请参阅视图片段(函数、模板标记和其他一些方法结合起来,这些方法让我不知所措。

我使用django的内置用户作为我的团队,并在models.py:上创建了一个玩家类

class Player(models.Model):
player_full = models.CharField(max_length=50)
player_sal_19_20 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
player_sal_20_21 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
player_sal_21_22 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
player_sal_22_23 = models.DecimalField(default=0, max_digits=10, decimal_places=2)
player_owner = models.ForeignKey(User, default='26', on_delete=models.CASCADE)

然后我在views.py:上创建了一个用户玩家页面的视图

class UserPlayerListView(ListView):
model = Player
template_name = 'blog/user_players.html'
context_object_name = 'players'
paginate_by = 20
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Player.objects.filter(player_owner=user).order_by('-date_posted')

最后,我能够用循环在html模板上映射出简单的东西。但遗憾的是,当我要查询一组由指定的幻想用户过滤的球员的年薪时,我遇到了一个障碍。

需要明确的是,这正是我所需要的:对出现在球队名单上的每个球员的"player_sal_19_20"字段求和,该字段由球员的"fantasy_owner"字段确定。

我是django和python的新手。我想这其实很容易做到,所以如果是这样的话,我提前道歉。此外,如果有人知道人们在梦幻体育网站上使用python/django的例子,那也会很有帮助!

您可以通过重写get_context_data(...)方法来尝试如下操作:

class UserPlayerListView(ListView):
# rest of the code
def get_context_data(self, **kwargs):
context = super().get_context(**kwargs)
context['sum_of_salary'] = context['players'].aggregate(players_sum=Sum('player_sal_19_20'))['players_sum']
return context

然后在模板中使用:

{{ sum_of_salary }}

更新

(来自评论(因为你有多个想要聚合的属性,所以试着这样做:

class UserPlayerListView(ListView):
# rest of the code
def get_context_data(self, **kwargs):
context = super().get_context(**kwargs)
context['sum_sal_19_20'] = context['players'].aggregate(players_sum=Sum('player_sal_19_20'))['players_sum']
context['sum_sal_20_21'] = context['players'].aggregate(players_sum=Sum('player_sal_20_21'))['players_sum']
# and so on
return context

然后在模板中使用:

{{ sum_sal_19_20 }}
{{ sum_sal_20_21 }}
// and so on

但在这个解决方案中,当您调用aggregate()时,它将多次访问数据库。因此,我建议您应该评估要列出的查询集,并以Python的方式计算sum。例如:

class UserPlayerListView(ListView):
def get_context_data(self, **kwargs):
context = super().get_context(**kwargs)
player_list = list(context['players'])  # evaluates the query
context['sum_sal_19_20'] = sum([x.player_sal_19_20 for x in player_list])  # pythonic sum calculation
context['sum_sal_20_21'] = sum([x.player_sal_20_21 for x in player_list])
# and so on
context['players'] = player_list          
return context

更优雅的解决方案

您可以简单地通过获取值使用组:

def get_context_data(self, **kwargs):
context = super().get_context(**kwargs)
players_salary_values = list(
context['players'].values('player_owner').annotate(
salary_19_20=Sum('player_sal_19_20'),
salary_20_21=Sum('player_sal_20_21')
).values(
'salary_19_20', 
'salary_20_21'
)
)[0]
# as there is only one player owner here, you can use 1st index of the list
context.update(players_salary_values)
return context

@ruddra total搞定了,谢谢!

我把它搞得一团糟,可以简单地在def下添加更多的上下文dicts(?(来获得每年的工资总额:

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['sum_of_sal_19_20'] = context['players'].aggregate(players_sum=Sum('player_sal_19_20'))['players_sum']
context['sum_of_sal_20_21'] = context['players'].aggregate(players_sum=Sum('player_sal_20_21'))['players_sum']
context['sum_of_sal_21_22'] = context['players'].aggregate(players_sum=Sum('player_sal_21_22'))['players_sum']
context['sum_of_sal_22_23'] = context['players'].aggregate(players_sum=Sum('player_sal_22_23'))['players_sum']
return context

然后我可以简单地将模板中的"sum_of_sal_19_20"用作{{sum_of_sel_19_20}}

接下来,我将尝试弄清楚如何将这些数字用于工资上限,计算上限罚款以及所有有趣的事情。还将尝试解决用户之间的玩家交易问题。再次感谢!

最新更新