在Django中更新递归外键时排除实例

时间:2019-05-02 15:43:05

标签: django

我为员工提供以下模型和模型形式:

models.py

class Employee(models.Model):
    reports_to = models.ForeignKey(
        'self', on_delete=models.SET_NULL,
        null=True, blank=True)

forms.py

class EmployeeForm(forms.ModelForm):
    class Meta:
        model = Employee

这个想法是,雇员的老板本身就是雇员。

问题在于,当我更新实例时,创建的相应表单字段是所有员工(包括我自己更新的对象)的下拉列表。

是否有一种简便的方法可以从下拉选项中删除实例本身,以使没有员工将自己作为老板?

PS:我不是要寻找一种在提交表单后验证表单字段的解决方案,而是要从表单下拉列表中完全删除该选项。谢谢!

1 个答案:

答案 0 :(得分:2)

是的,您可以修改相应字段的queryset,并忽略该实例(如果已存在该实例)。喜欢:

class EmployeeForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        instance = self.instance
        if instance.pk is not None:
            self.fields['reports_to'].queryset = Employee.objects.exclude(pk=instance.pk)

    class Meta:
        model = Employee

如果实例具有不是pk的{​​{1}}(这意味着您 edit 实例,而不创建新实例) ),然后我们“修补”除所有None之外的所有Employee的查询集。