Django一对多关系

8

我有两个模型,一个是companyusers,另一个是qualification,一个用户可以拥有多个资格证书。
现在我需要在管理员创建用户时输入其资格证书,我该怎么做?

我尝试在用户模型中添加多对多字段,但没有成功...与其他用户相关的资格证书会显示在字段中,而我需要为新用户创建新的资格证书。

以下是代码:

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)

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

{"用户名":"史蒂夫","职位":"高级工程师", "出生日期": "1986-05-14"}

{"学历":"中学", "最高分":"1000", "获得分数":"850", "毕业年份":"1990"}

{"学历":"本科", "最高分":"750", "获得分数":"680", "毕业年份":"1992"}

{"学历":"研究生", "最高分":"1500", "获得分数":"1280", "毕业年份":"1997"}


一个资格证书是否只能与一个用户相关联?或者多个用户可以拥有相同的资格证书?如果是后者,那么ManyToManyField就是最合适的选择,因为一个公司用户可以拥有多个资格证书,而一个资格证书也可以被多个公司用户持有。 - j0ker
@jOker --- 由于资格包含用户获得的分数/得分,因此它应与仅一个用户相关,并且资格数量因用户而异。例如,如果用户1拥有2个资格,则用户2可以拥有2个或多个资格。 - Dharani
1个回答

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对象上简单地访问Qualifications。
在管理界面中,您首先需要创建一个新的CompanyUser,然后通过ForeignKey将任意数量的Qualifications分配给该用户。
请务必阅读Django文档中关于Model relationships的部分。

@joker,感谢您的回答,它很有帮助。但是我在上述解决方案中还有另一个问题。在创建CompanyUser之后,我需要为该用户创建资格证书。但是我需要在创建公司用户时同时创建资格证书。我该怎么做呢? - Dharani
显然,您首先必须创建CompanyUser,因为Qualifications依赖于其ID作为ForeignKey。因此,在保存资格时,用户必须已经在数据库中。在管理界面中没有内置的方法可以同时执行这两个操作。但是,如果您自己编写应用程序,可以创建一个表单来输入CompanyUser及其Qualifications的数据,将数据发送到服务器,并使用视图函数先保存用户,然后再保存其资格。 - j0ker
@j0ker-- 谢谢,那真的很有帮助。我在想是否有任何内置功能。 - Dharani
这个是否也考虑了多个用户具有相同资格的情况? - Srijan

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