Jungのツリーオブジェクト

あるプロジェクトに取り組んでいる間、会社の部門をツリー構造で保存する必要に直面しました。 このように実装しました:


簡略化された分割モデル:
クラスDepartment(models.Model):
name = models.CharField(maxlength = 255、null = False、blank = False)
コード= models.CharField(最大長= 15、一意= True、null = False、空白= False)
path = models.CharField(maxlength = 255、null = False、editable = False)
parent = models.ForeignKey( 'self'、null = True、blank = True)


つまり モデルはそれ自体を指します。 ここでのキーワードはパスです。ここでは、すべての祖先を通る現在のモデルへの「パス」を保存します。 自動的に生成するには、保存を再定義します。

def save(self):
self.parentの場合:
self.path = '%s%s /'%(self.parent.path、self.code)
その他:
self.path = '/%s /'%self.code
super(タイプ(self)、self).save()
Department.objects.filterのa(親= self.id):
a.save()


したがって、オブジェクトが保存されると、パスフィールドはそのすべての子孫に対して「再生成」されます。

これで、たとえば、このすべての従業員とそれに投資したすべてのユニットを簡単なリクエストで選択できます。

staff = Staff.objects.filter(department__path__startswith = department.path)


最終的な美容指導のために、Departmentオブジェクトの__str__を定義します。
def __str __(自己):
return "%s%s"%( '------' [:self.path.count( '/'、2)-1]、self.name)


現在、すべての形式で、ユニットを選択すると、そのネストの度合いが表示されます。

Source: https://habr.com/ru/post/J5959/


All Articles