ValueError - 无法赋值:必须是一个实例。

46

当我尝试向我的一个表中插入数据时,出现了以下错误:

无法分配“1”:“Team.department_id”必须是“Department”的实例

我有点不确定自己是否正确使用了外键概念。下面给出了我尝试运行的插入以及models.py文件中的代码片段。

我想要做的是,当有人想要创建一个新团队时,他们必须将其附加到一个部门。因此,部门ID应该在两个表中都存在。

new_team = Team(
    nickname = team_name,
    employee_id = employee_id,
    department_id = int(Department.objects.get(
                        password = password,
                        department_name = department_name
                        ).department_id))

models.py

class Department(models.Model):  
    department_id = models.AutoField(auto_created=True,
                                     primary_key=True,
                                     default=1)  
    department_name = models.CharField(max_length=60)
    head_id = models.CharField(max_length=30)
    password = models.CharField(max_length=128)


class Team(models.Model):  
    team_id = models.AutoField(primary_key=True)
    department_id = models.ForeignKey('Department',
                                       related_name = 'Department_id')
    employee_id = models.CharField(max_length=30)
    nickname = models.CharField(max_length=60)
    team_image = models.ImageField(upload_to=get_image_path,
                                   blank=True, null=True)
3个回答

75

你不需要传递部门ID,实例本身就足够了。

以下代码应该可以正常工作:

new_team = Team(
    nickname = team_name,
    employee_id = employee_id,
    department_id = Department.objects.get(password = password,
                                           department_name = department_name))

注意:永远不要将您的外键字段命名为something_id。

something就足够了。Django旨在从用户的角度使事情变得容易,而_id后缀意味着您正在考虑数据库层面。实际上,如果您将列命名为department,Django将自动为您在数据库中创建department_id列。

按照现有的方式,您正在让Django创建相当愚蠢的department_id_id


7
非常感谢。它起作用了。但是你们两个的解释都有助于我理解。 - rahimbah
不要忘记添加这行代码:new_team.save() - Karam Qusai

13

这是在Google搜索中首先出现的,因此为新手提供了另一种选择。如果您方便访问id并且不想进行另一个查询,也可以通过这种方式执行:


new_team = Team(
    nickname = team_name,
    employee_id = employee_id,
    department_id_id = Department.objects.get(password = password, department_name = department_name).department_id
)

简而言之,{foreign_key_name}_id 如果你想直接分配 ID。


3
{foreign_key_name}_id 正是我正在寻找的。谢谢。 - thiras

0
@munsu 的答案有一个不同的变体。如果您已经拥有外键字段的ID。
department_id = 2; #the department id for the new team

new_team = Team(
    nickname = team_name,
    employee_id = employee_id,
    department_id = Department(id=department_id)
)

new_team.save()

# but
new_team.department_id.id # 2 
new_team.department_id.department_name # None you cannot access any other fields 

我不知道这是否对任何情况有用,但是在这里呈现出来。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接