簡略化された分割モデル:
クラス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)
現在、すべての形式で、ユニットを選択すると、そのネストの度合いが表示されます。