0

これが私が達成しようとしていることの要点です。属性の固定リストを持つユーザーのリストがあります

EmployeeID
Employee
FirstName
LastName
SSN

これはモデルで簡単に作成でき、UI を生成してこれらの値を入力できます。

固定されていないが動的なユーザー属性の別のリストがあります。例として、従業員が結婚している場合、または卒業生である場合、より多くの情報を取得したいと思います。基本的に、従業員の追加プロパティのリストは無限であり、各従業員に固有です。また、常に変化しているため、事前に計画することはできません。このようなすべてのフィールドを持つテーブルを作成することは明らかに意味がありません

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

ここでは、mongodb のような NoSql db が理にかなっていると思います。従業員のemployeeIDとユーザーの関連情報のみをmongodbレコードに保存できると思います。人事担当者がこの情報を編集/入力するためのフォームを持つことができるように、UI を作成するにはどうすればよいですか? ユーザーごとに、表示/編集する属性と対応するテキスト フィールドのセットが異なります。助言がありますか?

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 に答える