【问题标题】:How to fix TypeError unsupported operand type(s) for +=: 'DeferredAttribute' and 'int'如何修复 += 的 TypeError 不支持的操作数类型:'DeferredAttribute' 和 'int'
【发布时间】:2019-08-28 11:19:55
【问题描述】:

我正在尝试创建一个类似幻想的应用程序,我希望用户每次添加玩家时的起始 11 都会增加,并且团队预算会随着玩家价格的数量而减少。

我正在为 python 使用 django web 框架。

这是我的用户团队模型

class UserTeam(models.Model):
    name = models.CharField(max_length=50)
    user = models.OneToOneField(User, on_delete=models.CASCADE, default=None)
    players = models.ManyToManyField(Player)
    budget = models.IntegerField(default=100000000)
    FORMATION_CHOICES = (
        ('4-3-3', '4-DEF 3-MID 3-ATT'),
        ('4-4-2', '4-DEF 4-MID 2-ATT'),
        ('3-4-3', '3-DEF 4-MID 3-ATT'),
        ('5-3-2', '5-DEF 3-MID 2-ATT'),
    )
    formation = models.CharField(max_length=10, choices = FORMATION_CHOICES)
    starting_xi = models.IntegerField(default=0)
    bench_sub = models.IntegerField(default=0)
    total_score = models.IntegerField(default=0)
    round_score = models.IntegerField(default=0)
    Highest_team_score = models.IntegerField(default=0)


    @classmethod
    def transfer_player_in(cls, user, new_player):
        team, created = cls.objects.get_or_create(
            user=user
        )

        team.players.add(new_player)

    @classmethod
    def transfer_player_out(cls, user, new_player):
        team, created = cls.objects.get_or_create(
            user=user
        )

        team.players.remove(new_player)

我的播放器模型

class Player(models.Model):
    POSITION_CHOICES = (
        ('ATT', 'Attacker'),
        ('MID', 'Midfielder'),
        ('DEF', 'Defender'),
        ('GK', 'GoalKeeper'),
    )
    name = models.CharField(max_length=50)
    FirstName = models.CharField(max_length=20)
    LastName = models.CharField(max_length=20)
    position = models.CharField(max_length=3, choices = POSITION_CHOICES)
    country = models.ManyToManyField(Country)
    photo = models.ImageField(blank=True)
    price = models.IntegerField(default=0)
    total_score = models.IntegerField(default=0)

这是处理玩家进出转移的视图函数

def Transfer_Player(request, operation, pk):
    player= Player.objects.get(pk=pk)  #gets a particular player into the variable player
    if operation =='add':    #if user wants to buy player
        UserTeam.starting_xi += 1
        UserTeam.budget = UserTeam.budget - Player.price
        UserTeam.transfer_player_in(request.user, player)  #add player to team
        UserTeam.save

    elif operation =='sell':
        UserTeam.transfer_player_out(request.user, player)
    else:
        pass
    return redirect('/Fantasy')

我希望用户的起始 11 每次执行添加操作时都会增加 1,并且用户预算会因播放器的价格而减少,但是却收到 TypeError,+= 不支持的操作数类型: 'DeferredAttribute' 和 'int'。

【问题讨论】:

  • 您正在引用 UserTeam 。但是你需要一个实例。 您打算参考哪个团队?

标签: python django


【解决方案1】:

你需要有一个UserTeam 的具体实例才能做你想做的事。我怀疑你的代码应该是这样的:


if operation =='add':    #if user wants to buy player
    team = UerTeam.objects.get(user_id=request.user.id)
    team.starting_xi += 1
    team.budget -= player.price
    team.save()
    UserTeam.transfer_player_in(request.user, player)  #add player to team

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2017-12-27
    • 2014-03-31
    • 2012-12-12
    相关资源
    最近更新 更多