2017-04-18 26 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) 
相关问题