Python 我的django幻想足球项目。如何向每个用户显示其他用户的分数?

Python 我的django幻想足球项目。如何向每个用户显示其他用户的分数?,python,django,django-models,Python,Django,Django Models,我在django中构建了一个非常基本的fantasy足球应用程序,它允许用户为他们的球队选择和删除球员,然后将球员的个人得分汇总为球队得分。我真正想添加到应用程序中的是能够看到其他用户的总分,这样每个人都可以比较他们彼此的表现。我对django很陌生,所以在过去几天的空闲时间里,我一直在想一种方法来做这件事,但我真的不知道该怎么做(甚至不知道该如何清楚地问它是怎么做的)。我的一个想法是创建一个新的模型对象,该对象可以包含用户的团队总得分,但我真的不知道如何首先将团队得分变量放入该模型对象中 现在

我在django中构建了一个非常基本的fantasy足球应用程序,它允许用户为他们的球队选择和删除球员,然后将球员的个人得分汇总为球队得分。我真正想添加到应用程序中的是能够看到其他用户的总分,这样每个人都可以比较他们彼此的表现。我对django很陌生,所以在过去几天的空闲时间里,我一直在想一种方法来做这件事,但我真的不知道该怎么做(甚至不知道该如何清楚地问它是怎么做的)。我的一个想法是创建一个新的模型对象,该对象可以包含用户的团队总得分,但我真的不知道如何首先将团队得分变量放入该模型对象中

现在,my models.py只有用户和玩家位置类

from django.contrib.auth.models import AbstractUser
from django.db import models
import datetime



class User(AbstractUser):
    pass


class Quarterback(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)  
    name = models.CharField(max_length=20, blank=True)
    score = models.IntegerField(blank=True, null=True)

    ...rest of the player-position objects repeat...
我在views.py中有一个函数,用于计算团队的总分,并将其作为渲染上下文传递。总分存储在列表变量中。变量的名称是“totalscore”。是否有办法将此“totalscore”变量传递给新的对象模型?或者,有没有一种完全不同/更好的方法,我只是不知道?非常感谢您的建议

url.py

from django.urls import path

from . import views
from game.views import index, show, playerchoose, delete_QB, delete_RB, delete_WR, delete_TE, delete_K

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("players", views.players, name="players"),
    path("playerinfo", views.playerinfo, name="playerinfo"),
    path('pickteam', views.pickteam, name="pickteam"),
    path('delete_QB/<int:id>', views.delete_QB, name="delete_QB"),
    path('delete_RB/<int:id>', views.delete_RB, name="delete_RB"),
    path('delete_WR/<int:id>', views.delete_WR, name="delete_WR"),
    path('delete_TE/<int:id>', views.delete_TE, name="delete_TE"),
    path('delete_K/<int:id>', views.delete_K, name="delete_K"),
    path('show',views.show, name="show"),
    path('scoreboard', views.scoreboard, name="scoreboard"), 
    path('playerchoose', views.playerchoose, name="playerchoose")
从django.url导入路径
从…起导入视图
从game.views导入索引、显示、玩家选择、删除QB、删除RB、删除WR、删除TE、删除K
URL模式=[
路径(“,views.index,name=“index”),
路径(“login”,views.login\u view,name=“login”),
路径(“注销”,views.logout\u view,name=“logout”),
路径(“register”,views.register,name=“register”),
路径(“players”,views.players,name=“players”),
路径(“playerinfo”,views.playerinfo,name=“playerinfo”),
路径('pickteam',views.pickteam,name=“pickteam”),
路径('delete_QB/',views.delete_QB,name=“delete_QB”),
路径('delete_-RB/',views.delete_-RB,name=“delete_-RB”),
路径('delete_-WR/',views.delete_-WR,name=“delete_-WR”),
路径('delete_TE/',views.delete_TE,name=“delete_TE”),
路径('delete_K/',views.delete_K,name=“delete_K”),
路径('show',views.show,name=“show”),
路径('scoreboard',views.scoreboard,name=“scoreboard”),
路径('playerchoose',views.playerchoose,name=“playerchoose”)

您可能正在寻找聚合/注释。

我想大概是这样

my_users = User.objects.annotate(total_score=Sum('quarterback__score'))
def total_score(self):
    score = 0
    for player in self.players:
        score = score + player.score
    return score
如果您现在将my_用户放在一个视图中,每个用户都会有一个属性“total_score”,您可以将它们相互比较


编辑您的评论:

如果我是你,我可能会有这样的模型:

class User(AbstractUser):
    pass

class Team(models.Model):
    author = models.ForeignKey(User, ...)

class Player(models.Model):
    QUARTERBACK =  'QB'
    BALLRUNNER = 'BR'
    BALLKICKER = 'BK'
    PLAYER_POSITION_CHOICES = [
        (QUARTERBACK = 'Quarterback'),
        (BALLRUNNER, 'Ballrunner'),
        (BALLKICKER, 'Ballkicker'),
    ]
    team = models.ForeignKey(Team, ...)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=20, blank=True)
    position = models.CharField(choices=PLAYER_POSITION_CHOICES)
    score = models.IntegerField(blank=True, null=True)
class FootballPlayer(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE, 
        null=True
    )  
    name = models.CharField(max_length=20, blank=True)
    score = models.IntegerField(blank=True, null=True)
    position = models.CharField(max_length=20, blank=True)
然后你有
Team.objects.annotate(总分=总和('player\u分数'))
您还可以在对象中放入自己的函数。 比如
团队
可以有

my_users = User.objects.annotate(total_score=Sum('quarterback__score'))
def total_score(self):
    score = 0
    for player in self.players:
        score = score + player.score
    return score
这可能不是做事情最有效的方式,但请记住这是一种可能性


有关玩家模型更改的文档,请参阅选项。

从您的问题来看,您似乎还没有一个
团队
模型。这可能是您的下一步。类似这样的内容将是一个好主意:

from django.conf import settings

class Team(models.Model):
    team_name = models.CharField(max_length=255, blank=True)
    user = models.ForeignKey(
      settings.AUTH_USER_MODEL,
      on_delete=models.CASCADE
    )
    quarter_back = models.ForeignKey(
      QuarterBack,
      on_delete=models.SET_NULL
    )
    # other players here
(对不起,我对美式足球了解不多,所以不知道你是否有一个或多个四分卫等。)

如果所有不同球员位置的模型都相同,最好只使用一个
FootballPlayer
类,然后添加一个属性来描述该模型的位置,如下所示:

class User(AbstractUser):
    pass

class Team(models.Model):
    author = models.ForeignKey(User, ...)

class Player(models.Model):
    QUARTERBACK =  'QB'
    BALLRUNNER = 'BR'
    BALLKICKER = 'BK'
    PLAYER_POSITION_CHOICES = [
        (QUARTERBACK = 'Quarterback'),
        (BALLRUNNER, 'Ballrunner'),
        (BALLKICKER, 'Ballkicker'),
    ]
    team = models.ForeignKey(Team, ...)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=20, blank=True)
    position = models.CharField(choices=PLAYER_POSITION_CHOICES)
    score = models.IntegerField(blank=True, null=True)
class FootballPlayer(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE, 
        null=True
    )  
    name = models.CharField(max_length=20, blank=True)
    score = models.IntegerField(blank=True, null=True)
    position = models.CharField(max_length=20, blank=True)
(注意,最好使用
设置。用户身份验证\u模型
,而不是
用户

然后,您可以使用玩家和团队之间的多对多关系。您可以向
团队
类添加一个方法以获得总分:

class Team(models.Model):
    ...
    @property
    def score(self):
        # logic to calculate total score here

显示
urls.py
文件。@JohnGordon当然可以。刚刚添加了它。显示团队的视图是什么?它是否只显示您自己的团队?如果是这样,那么一个解决方案似乎是创建一个显示任何团队的视图,而不仅仅是您自己的团队。@JohnGordon是的,当前视图只显示您自己的团队。创建一个显示任何团队的视图?That听起来非常合乎逻辑。只是想想象一下如何实现它。它应该与现有视图非常相似,只是要显示的团队ID将作为URL的一部分传入,而不是从当前登录用户的
用户
模型中获取。鉴于一个团队中有多个参与者,您是否可以添加对此有几个参数?例如User.objects.annotate(总分=Sum('quarterback\uuuu score'、'runningback\u score'…等等))我编辑了我的答案。我不确定是否可以按照你在评论中要求的那样做。你可以尝试,但我会以任何方式将团队添加为对象。我所做的最大更改是对玩家模型的更改。除非有属性要求不同的位置使用不同的模型,否则我会将它们全部放在同一个模型中。蒂姆说:“嗨。”s的答案比我的好。但看起来我们的想法是一样的。谢谢你的好答案。我以前确实尝试过一个选择字段,但当我尝试执行CRUD的删除部分时,它让我非常头疼。现在,我计划为每个玩家的位置保留单个对象模型。有点粗糙,但在这种情况下有效。我构建了一个am模型如您所建议。我现在遇到的问题是计算团队分数。我的球员模型不包含分数字段,因为它们将通过api更新。我正在将团队模型中的球员与变量中的分数数据进行比较,并将结果存储在分数变量中…尝试至少。