私は現在、会社に所属する従業員がいる構造を作成しています。この会社内で、いくつかのグループを作成できる必要があります。よろしければランク付けします。低いランクには少ないアクセス許可を割り当て、高いランクには多くのアクセス許可を割り当てることができます。
オブジェクト レベルのアクセス許可を取得したいのですが、django-guardian プロジェクトが必要なものを正確に提供してくれることに気付きました。これはネイティブの User および Group オブジェクトで動作するため、会社のオブジェクトにネイティブのグループ オブジェクトを実装する方法を見つけようとしています。
私が直面している問題は、グループ内の名前が一意であることです。そのため、2 社が同じグループを追加すると、エラーが発生します。
ある意味で機能する実装を見つけましたが、私にはかなり「ハッキー」に思えます。私の会社では、Group を参照するグループ変数を宣言しました。
class Company(models.Model):
...
groups = models.ManyToManyField(Group, through='CompanyRole')
CompanyRole は基本的に、グループ名と会社およびグループへの参照を格納します。
class CompanyRole(models.Model):
group = models.ForeignKey(Group)
company = models.ForeignKey(Company)
real_name = models.CharField(max_length=60, verbose_name=_('Real name'))
objects = CompanyGroupManager()
新しい「企業グループ」を追加する便利な方法でカスタムマネージャーを作成しました
class CompanyGroupManager(models.Manager):
def create_group(self, company, group_name):
un_group_name = str(company.id) + '#' + group_name
group = Group.objects.create(name=un_group_name)
company_group = self.model(
real_name=group_name,
company=company,
group=group
)
company_group.save(using=self._db)
return company_group
ここが、私が特に違和感を感じない部分です。Group モデルの一意の名前に関する問題を変更するために、会社 ID、ハッシュ記号、および実際のグループ名を組み合わせて衝突を回避しました。
私の質問は次のとおりです。私のシナリオにはより良い方法がありますか、何か不足していますか、それとも必要なことを達成するための良い方法ですか?