Django:具有选择列表的自引用外键

时间:2017-04-18 05:56:24

标签: python django class django-models

我的模型定义了一个员工,该员工有一个名字,ID,工作和经理。我希望能够指定一个可以列为另一个员工经理的员工选择列表(类似于工作字段)。为此我已经包括

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中,我定义了以下函数:

def get_managers():
    managers = []
    for manager in Employee.objects.filter(is_manager=True):
        managers.append((manager.employee_id, manager.name))
    return managers

我的问题是,当函数放在Employee类定义之前时,我得到NameError: name 'Employees' is not defined,并且在Employee类定义之后放置错误NameError: name 'get_managers()' is not defined。我已经尝试将get_managers()放在类中并得到`NameError:name'get_managers()'未定义

如果有更好的方法来完成同样的事情,我会接受建议。

2 个答案:

答案 0 :(得分:1)

来自Django文档:http://docs.djangoproject.com/en/dev/ref/models/fields/#choices

  

最后,请注意,选择可以是任何可迭代对象 - 而不是   必须是一个列表或元组。这可以让你构建选择   动态。但是,如果你发现自己的选择是动态的,   你可能最好使用一个合适的数据库表   ForeignKey的。选择适用于不会发生太大变化的静态数据,   如果有的话。

答案 1 :(得分:0)

如果您使用的是django admin,则可以执行此操作。

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)