欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django之Mode的外键自关联和引用未定义的Model方法

程序员文章站 2023-11-03 08:57:03
django model的外键自关联 在django的model定义中,有时需要某个field引用当前定义的model,比如一个部门(department)的model,...

django model的外键自关联

在django的model定义中,有时需要某个field引用当前定义的model,比如一个部门(department)的model,它有一个字段是上级部门(super_department),上级部门应该是一个外键并引用model department,即:

class department(models.model):
 
  '''
  some other filed
  '''
  super_department = models.foreignkey(department)

但是这样的定义对于python来说是不允许的,因为在定义field super_department时,department定义还未完成,python会提示你department未定义,那么怎么办呢?放心吧,django已经为你考虑好这种情况了,只需要在定义时将foreignkey所引用的model改为‘self'即可,即:

class department(models.model):
  
  '''
  some other filed
  '''
  super_department = models.foreignkey('self')

然后同步models至数据库时就会生成一个引用自己的外键。

django model之引用一个未定义的model

有时在django的model定义中,会出现引用一个未定义model的情况,比如一个用户(user)属于某一个部门(department),每一个部门有一个领导(leader),这个领导也是一个用户,即:

class department(models.model):
  
  name = models.charfield(max_length=20)
  leader = models.foreignkey(user, related_name = 'lead_group', null = true)
 
class user(models.model):
  
  username = models.charfield(max_length = 20)
  department = models.foreignkey(department, related_name = 'users')

但这么定义就会引发在department定义时,field leader引用user,但此时的user还未定义。有人会说,先定义user,再定义department,那也会引发一样的问题,因为user的department引用department,此时的department一样未被定义。那么这时候怎么办呢?其实,只需要将foreignkey引用的model改为字符串即可,即:

class department(models.model):
  
  name = models.charfield(max_length=20)
  leader = models.foreignkey('user', related_name = 'lead_group')#user now be str type
 
class user(models.model):
  
  username = models.charfield(max_length = 20)
  department = models.foreignkey(department, related_name = 'users')

以上这篇django之mode的外键自关联和引用未定义的model方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。