You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django创建对象报错:player_team()收到意外关键字参数'player'、'team'

Django创建对象报错:player_team() got unexpected keyword arguments: 'player', 'team'

问题原因

报错源于两个核心问题:

  1. 字段名大小写不匹配:模型里定义的ForeignKey字段是大写的Player和Team,但视图创建对象时用了小写的player和team,Django对模型字段名大小写严格区分,导致识别不到对应字段。
  2. ID类型与传递方式错误:request.POST.get()获取到的是字符串类型的ID,而ForeignKey字段需要整数类型的ID(或模型实例),直接传递字符串会引发类型错误;同时用字段名_id后缀传递ID是更直接的方式。

修正代码

模型代码(可选:遵循PEP8规范优化命名)

建议模型类名和关联模型名采用大驼峰命名(符合Python编码规范),字段名改为小写更易读:

# 先确保关联的模型类名正确(比如player改为Player,team改为Team)
class Player(models.Model):
    name = models.CharField(max_length=100)
    # 其他Player模型字段

class Team(models.Model):
    name = models.CharField(max_length=100)
    # 其他Team模型字段

class PlayerTeam(models.Model):
    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True)

视图代码(针对现有模型的直接修正)

如果暂时不想修改模型命名,按以下方式修正视图:

def assign_team(request):
    if request.method == "POST":
        player_id = request.POST.get("Players")
        team_id = request.POST.get("Teams")
        
        # 方式1:匹配模型定义的大写字段名,转换ID为整数
        player_team.objects.create(
            Player=int(player_id),
            Team=int(team_id) if team_id else None
        )
        
        # 方式2:使用字段名+_id后缀(更推荐,无需查询模型实例)
        # player_team.objects.create(
        #     Player_id=int(player_id),
        #     Team_id=int(team_id) if team_id else None
        # )
        
        return redirect(request.META['HTTP_REFERER'])

关键说明

  • 字段名必须和模型定义完全一致,大小写不能出错。
  • POST请求获取的ID是字符串,必须转换为整数才能传递给ForeignKey字段;由于Team字段允许为空,要处理team_id为空的情况,避免int(None)报错。
  • 推荐使用字段名_id的方式传递ID,无需先查询模型实例,性能更优。

内容的提问来源于stack exchange,提问作者odafe omajuwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:59