使用self rererenced Foreignkey关系创建新记录

时间:2016-07-12 11:23:50

标签: python django foreign-key-relationship

以下是我的models.py并自我引用了外键关系。

class emp_details(models.Model):
    emp_id              =   models.AutoField(primary_key = True) 
    emp_first_name      =   models.CharField(max_length = 50,null = False)
    emp_manager_id      =   models.ForeignKey('self')

a1 = emp_details(emp_first_name = "ramesh",emp_manager_id = 2)
a1.save()

我在这里尝试创建新记录。但是我收到了以下错误:

ValueError: Cannot assign "'2'": "emp_details.emp_manager_id" must be a "emp_details" instance.

如何使用自我重新获取的外键关系创建新记录?

1 个答案:

答案 0 :(得分:1)

在您的情况下,emp_manager_id是外键字段,因此您应将ID指定为emp_manager_id_id

a1 = emp_details(emp_first_name = "ramesh", emp_manager_id_id=2)

最好将字段名称更改为emp_manager。请注意,建议您使用CamelCase作为模型名称,因此EmpDetail优于emp_details。把它们放在一起,你有:

class EmpDetail(models.Model):
    emp_id = models.AutoField(primary_key = True) 
    emp_first_name = models.CharField(max_length = 50,null = False)
    emp_manager = models.ForeignKey('self')

现在emp_manager是外键,您可以将ID指定给emp_manager_id

a1 = EmpDetail(emp_first_name="ramesh", emp_manager_id_id=2)

如果要将emp_manager设置为对象本身,则需要先将对象保存到数据库,以便获取主键。

a1 = EmpDetail(emp_first_name="ramesh")
a1.save()
a1.emp_manager = a1  # You could do 'a1.emp_manager_id = a1.id' instead 
a1.save()

为此,您需要在外键上设置null=True,以便您可以在不设置emp_manager的情况下保存对象。

emp_manager = models.ForeignKey('self', null=True)