python - 如何为 += 修复 TypeError 不支持的操作数类型:“DeferredAttribute”和“int”
问题描述
我正在尝试创建一个类似幻想的应用程序,我希望每次添加玩家时用户的起始 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 '和'整数'。
解决方案
你需要有一个 a 的具体实例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
推荐阅读
- codeigniter - Codeigniter 4 - 如何自定义下载文件的文件名(具有不同的文件扩展名,如 jpg、jpeg / pdf)?
- javascript - Weblogic 目标运行时错误 - 目标运行时未定义错误
- react-native - 为什么在导航之前加载我的另一个屏幕?
- python - 如何检查两个数字列表的百分比相似性?
- reactjs - 删除某些路线反应的侧边栏
- xamarin - Zebra TC26 扫描仪在代码中更改配置时不扫描 - Xamarin
- flutter - 图像未显示在资产中
- php - 未设置不同域 API 发送的 Cookie
- spring - spring oauth2 资源服务器:禁用 ssl 验证
- java - 如何理解“新”Java 飞行记录器 ObjectAllocationSample 事件?