2017-12-13 5 views
0

나는 자체 외래 키를 가지고있는 모델을 가지고있다.Django의 같은 테이블에서 외래 키에 대한 동일한 객체 참조를 차단하는 방법은 무엇입니까?

models.py

class Employee(AbstractUser): 
    manager = models.ForeignKey('self', on_delete=models.SET_NULL, related_name=_('manger'), null=True) 

지금은 관리 사이트에이 모델을 추가하고의 자신의 매니저로 스스로가 설정할 수 있습니다 직원의 사용자를 업데이트하려고하면. 따라서 직원 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를 집합에 전달할 것인지 모르겠다. 예를 들어

:

models.py

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), 
) 

위의 코드는 모든 관리자의 3을 제외하고 내 매니저의 선택을 제한하지만이 또한 Valie 동적 만드는 방법을 잘 모릅니다.

나는 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의 양식을 사용하는 것을 잊지 마십시오.