2017-04-18 28 views
1

我的模型定義了一個僱員,該僱員具有姓名,ID,工作和經理。我希望能夠指定可以列爲另一個員工經理的員工選項列表(類似於jobs字段)。要做到這一點我已經包括Django:具有選擇列表的自引用外鍵

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 

而且在我的models.py我已經定義了以下功能:

​​

我的問題是,當功能被放置在Employee類定義之前,我NameError: name 'Employees' is not defined並且在Employee類定義之後放置錯誤NameError: name 'get_managers()' is not defined。我曾嘗試將get_managers()放在課程中,並且沒有定義'NameError:name'get_managers()'

如果有更好的方法來完成同樣的事情,我會接受建議。

+0

你使用任何形式的?或者這是在Django的管理員? – itzMEonTV

+0

正如安德烈在他的回答中所建議的那樣,這不應該是一個「選擇」字段,因爲數據依賴。你應該保持邏輯與模型分開。 –

回答

1

從Django文檔: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 

然後在模型

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

admin.py

admin.site.register(Employee, EmployeeAdmin) 
相關問題