私は自己の外部キーを持つモデルを持っています。今Djangoの同じテーブル内の外部キーの同じオブジェクト参照をブロックする方法は?
models.py
class Employee(AbstractUser):
manager = models.ForeignKey('self', on_delete=models.SET_NULL, related_name=_('manger'), null=True)
私はadminサイトにこのモデルを追加し、従業員のユーザーさんが自分のマネージャーとしてその人自身を設定することができます更新してみてください。だから私は従業員のID#1を更新しようとしている場合、私は従業員のID#1がマネージャのドロップダウンに表示されないようにします。
追加の質問
私はしかし、私は、現在のオブジェクトIDは、管理者IDに対してチェックして取得する方法がわからない、私は私の更新の形で、この条件を検証きれいなメソッドを追加することができます知っています。
forms.py
class EmployeeChangeForm(UserChangeForm):
class Meta:
model = Employee
fields = '__all__'
def clean_manager(self):
# An Employee Cannot have himself assigned as a manager
eID = ?? # how do i get the id of Current Employee here ?
mgr = self.cleaned_data["manager"]
if eID == mgr:
raise forms.ValidationError("Employee and Manger should be diffrent !!")
return mgr
現在のユーザーが、しかし、彼のマネージャーとして設定としての地位を設定から従業員をブロックすることはできません上記のアプローチは、従業員がまだマネージャーフィールドのドロップダウンに表示されます。現在の従業員がドロップダウンに表示されない場合は、私は好きです。
これを行う方法はありますか?
更新:
私はちょうど約ForeignKey.limit_choices_to
関連テーブルのセットparticulerに選択肢を制限することを学びました。しかし、再び、私は現在のユーザーIDをどのようにセットに渡すのか分かりません。例えば
:
from django.db.models import Q
class Employee(AbstractUser):
manager = models.ForeignKey(
'self',
on_delete=models.SET_NULL,
related_name=_('manger'),
null=True,
limit_choices_to=~Q(id=3),
)
models.pyは、上記のコードは、すべての管理者の3を除いに私のマネージャーの選択肢を制限するが、私はこのヴァリエを動的にする方法を知ってはいけません。
私はlimit_choices_to=~Q(id=self.pk)
またはlimit_choices_to=~Q(id=self.id)
を行うカント
これを見てくださいhttps://stackoverflow.com/questions/6325681/passing-a-user-request-to-forms –