0

这是我要实现的目标的要点。我有一个用户列表,其中有一个固定的属性列表

EmployeeID
Employee
FirstName
LastName
SSN

这可以很容易地在模型中创建,并且可以生成一个 UI 来输入这些值

我有另一个用户属性列表,它不是固定的,而是动态的。例如,如果员工已婚,如果他是毕业生,我想获取更多信息。基本上,员工的附加属性列表是无限的,并且特定于每个员工。它也在不断变化,因此无法提前计划。显然创建一个包含所有字段的表是没有意义的

EmployeeID (foreignKey Employee table)
IsMarried
SpouseName
IsGraduate
GraduationYear
GraduationMajor
GraduationMinor
IsCertified
...

我认为像 mongodb 这样的 NoSql 数据库在这里很有意义。我相信我可以在 mongodb 记录中保存员工的员工 ID 和用户的相关信息。如何创建 UI,以便 HR 人员可以使用表单来编辑/输入此信息?每个用户将有一组不同的属性和相应的文本字段来显示/编辑。有什么建议么?

4

1 回答 1

2

对于使用关系数据库的动态属性,您可以尝试以下操作:

class Employee( models.Model ):
    firstname = models.CharField( max_length=50 )
    lastname  = models.CharField( max_length=50 )
    ssn       = models.IntegerField()

class EmployeeAttribute( models.Model ):
    ATTRIBUTE_CHOICES = (
        (0, 'is_married'),
        (1, 'spouse_name'),
        (2, 'is_graduate'),
               ...
    )
    name      = models.IntegerField( max_length=3, choices=ATTRIBUTE_CHOICES )
    value     = models.CharField( max_length=255 )
    employee  = models.ForeignKey( 'Employee' )

每当您想要添加一个新属性时,只需将其附加到属性选择元组中,并增加最后一个数字。

如果您的目标是不需要在每次需要添加新属性时都编写额外代码,请尝试以下操作:

class Employee( models.Model ):
    firstname = models.CharField( max_length=50 )
    lastname  = models.CharField( max_length=50 )
    ssn       = models.IntegerField()

class Attribute( models.Model ):
    name      = models.CharField( max_length=50 )

class EmployeeAttribute( models.Model ):
    attribute = models.ForeignKey( 'Attribute' )
    employee  = models.ForeignKey( 'Employee' )

使用这种方法,您至少可以创建一个区域,允许您通过 Django 管理员或自定义模板创建新属性。获取员工的扩展属性就像这样简单:

employee = Employee.objects.get( firstname='John', lastname='Doe' )
extended_attributes = employee.employee_attribute_set.all()
于 2012-11-15T22:12:04.363 回答