django一对多的关系

时间:2012-03-16 08:05:53

标签: django

我有一个两个模型,一个是公司用户,另一个是资格 一个用户有很多资格 现在我需要输入资格,同时在管理员中创建用户我该怎么做?

我试图在用户模型中保留多个字段,但徒劳无功...... 与其他用户相关的资格填充在我需要为新用户创建新资格的字段中。

代码如下......

class Qualification(models.Model):
    qualification = models.CharField(max_length=250)
    max_marks = models.IntegerField(max_length=50)
    marks_obtained = models.IntegerField(max_length=50)
    qualifying_year = models.DateField(auto_now=False, null=True)

class CompanyUser(User):
    date_of_birth = models.DateField(auto_now=False, null=True)
    position = models.CharField(max_length=100)
    qualifications = models.ManyToManyField(Qualification)

这是公司用户详细信息..

  

{“username”:“steve”,“position”:“高级工程师”,“date_of_birth”:“1986-05-14”}

     

{“qualified”:“中学”,“max_marks”:“1000”,“marks_obtained”:“850”,“qualifying_year”:“1990”}

     

{“qualified”:“undergraduation”,“max_marks”:“750”,“marks_obtained”:“680”,“qualifying_year”:“1992”}

     

{“qualified”:“postgraduation”,“max_marks”:“1500”,“marks_obtained”:“1280”,“qualifying_year”:“1997”}

1 个答案:

答案 0 :(得分:13)

Django中不存在您要查找的一对多关系。这是不需要的,因为你可以反过来做:使用从资格到用户的ForeignKey关系。根据您的示例,您可以按如下方式定义模型:

class Qualification(models.Model):
    qualification = models.CharField(max_length=250)
    max_marks = models.IntegerField(max_length=50)
    marks_obtained = models.IntegerField(max_length=50)
    qualifying_year = models.DateField(auto_now=False, null=True)
    user = models.ForeignKey('CompanyUser', related_name='qualifications')

class CompanyUser(User):
    date_of_birth = models.DateField(auto_now=False, null=True)
    position = models.CharField(max_length=100)

因此,从CompanyUser到Qualification没有指定任何关系,但您有从Qualification到CompanyUser的ForeignKey关系(即每个资格属于一个用户,但多个资格可以属于同一个用户)。 Django自动维护从CompanyUser到Qualification的向后关系,这是您正在寻找的一对多关系。通过ForeignKey的选项related_name,您可以为向后关系指定有意义的名称(在本例中为'qualifications')。您现在可以使用属性user.qualifications简单地访问CompanyUser对象上的资格。

在管理员中,您首先要创建一个新的CompanyUser,然后创建通过ForeignKey分配给该用户的任意数量的资格。

请务必阅读Django文档部分中关于Model relationships的内容。