在 Form ChoiceField 中显示全名但保存 ID

Display full names in Form ChoiceField but saving ID's

我有模型 Person - 来自另一个数据库 我把所有 person_id 复制到 custom_id.

models.py

class Employee(models.Model):
    custom_id = models.CharField(max_length=20, unique=True)

    @property
    def person(self):
        return Person.objects.get(person_id='%s' % self.custom_id)

    def __str__(self):
        return '%s' % self.custom_id

class Task(models.Model):
    employee = models.ManyToManyField(Employee, blank=True, null=True)
    task = models.CharField(max_length=100)
    comment = models.CharField(max_length=200)

    def __str__(self):
        return '%s' % self.task

我将我的方法 person() 添加到 Employee 中,这允许我访问另一个数据库中的其他对象模型:

所以基本上当我在shell中输入这个时:

Employee.objects.get(custom_id='123').person.full_name

u'Adam Dylan'

我有一个 ModelForm 使用 ModelMultipleChoiceField

forms.py

class TaskCreateForm(forms.ModelForm):

    employee = forms.ModelMultipleChoiceField(queryset=Employee.objects.all())

    class Meta:
        model = Task

但是 Employee.objects.all() returns 一堆 custom_id 的。 我想要的是以“Employee(..).person.full_name”形式显示但只保存 custom_id's.

我不确定为什么您认为我对您的其他问题的回答在这里不起作用。您是否尝试过以下操作?如果不行,具体是怎么失败的?

class EmployeeMultipleChoiceField(ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.person.full_name

class TaskCreateForm(forms.ModelForm):
    employee = EmployeeMultipleChoiceField(queryset=Employee.objects.all())

    class Meta:
        model = Task