我的模型定义了一个员工,该员工有一个名字,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()'未定义
如果有更好的方法来完成同样的事情,我会接受建议。
答案 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)