2017-12-13 35 views
0

私は自己の外部キーを持つモデルを持っています。今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)

を行うカント

+0

これを見てくださいhttps://stackoverflow.com/questions/6325681/passing-a-user-request-to-forms –

答えて

1

はこれを試してみてください助けてください:

class EmployeeChangeForm(UserChangeForm): 

    class Meta: 
     model = Employee 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     if self.instance.pk: 
      self.fields['manager'].queryset = Employee.objects.exclude(
       pk=self.instance.pk, 
      ) 

form = EmployeeChangeFormを追加してModelAdminでフォームを使用することを忘れないでください。

関連する問題