这是我想要实现的目标。我有一个用户列表,其中包含固定的属性列表
EmployeeID
Employee
FirstName
LastName
SSN
这可以在模型中轻松创建,并且可以生成UI以输入这些值
我有另一个用户属性列表,它不是固定的,而是动态的。举个例子,如果员工已经结婚,如果他是毕业生,我想获取更多信息。基本上,员工的其他属性列表是无限的,并且将特定于每个员工。它也在不断变化,因此无法提前计划。显然没有必要创建一个包含所有字段的表
EmployeeID (foreignKey Employee table)
IsMarried
SpouseName
IsGraduate
GraduationYear
GraduationMajor
GraduationMinor
IsCertified
...
我觉得像mongodb这样的NoSql db在这里很有意义。我相信我可以保存员工的employeeID,只保存mongodb记录中用户的相关信息。如何创建UI以便HR人员可以使用表单来编辑/输入此信息?每个用户都有一组不同的属性和相应的文本字段来显示/编辑。有什么建议吗?
答案 0 :(得分: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()