2017-04-18 14 views
1

私のモデルは、名前、ID、ジョブ、およびマネージャーを持つ従業員を定義します。私は、他の従業員マネージャーとしてリストアップできる従業員の選択肢のリストを指定することができるようにしたいと思っています(jobsフィールドに似ています)。Django:選択リスト付き自己参照外部キー

​​

私の問題は、関数がEmployeeクラス定義の前に置かれたとき、私はNameError: name 'Employees' is not definedを得ることです。そうするために、私は私のmodels.pyで、私は次の関数を定義している。また

class Employee(models.Model): 
    EXECUTIVE = 'EXC' 
    SALESMAN = 'SAL' 
    ENGINEER = 'ENG' 
    CLERK = 'CLK' 
    JOBS = (
     (EXECUTIVE, 'Executive'), 
     (SALESMAN, 'Salesman'), 
     (ENGINEER 'Engineer'), 
     (CLERK, 'Clerk'), 
    ) 
    employee_id = models.CharField(max_length = 5, primary_key=True) 
    name = models.CharField(max_length=25) 
    job = models.CharField(max_length=3, choices=JOBS) 
    is_manager = models.BooleanField(default=False) 
    manager = models.ForeignKey('self', on_delete=models.PROTECT, null=True, choices=get_managers()) 

    def __str__(self): 
     return self.name 

が含まれていますEmployeeクラスの定義の後に置かれた場合、エラーNameError: name 'get_managers()' is not defined。私はget_managers()をクラスに入れて、 `NameError:name 'を取得しようとしました。get_managers()は定義されていません。

同じことを達成する良い方法があれば、 Djangoのドキュメントから

+0

manager = models.ForeignKey('self', on_delete=models.PROTECT, null=True, blank=True) 

に、あなたはどのフォームを使用していますか?またはこれはdjango管理者ですか? – itzMEonTV

+0

Andreyが彼の答えで示唆しているように、これは実際にはデータに依存するので、これは選択肢のフィールドではないはずです。ロジックをモデルと分離しておく必要があります。 –

答えて

1

http://docs.djangoproject.com/en/dev/ref/models/fields/#choices

Finally, note that choices can be any iterable object — not necessarily a list or tuple. This lets you construct choices dynamically. But if you find yourself hacking choices to be dynamic, you're probably better off using a proper database table with a ForeignKey. choices is meant for static data that doesn't change much, if ever.

0

あなたはDjangoの管理を使用している場合は、あなたがそれを行うことができます。

class EmployeeAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(EmployeeAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['manager'].queryset = Employee.objects.filter(is_manager=True) 
     return form 

は、その後のモデルadmin.py

admin.site.register(Employee, EmployeeAdmin) 
関連する問題