如何在Django的同一个表中阻止外键的相同对象引用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Django的同一个表中阻止外键的相同对象引用?相关的知识,希望对你有一定的参考价值。

我有一个具有自我外键的模型。

models.朋友

class Employee(AbstractUser):
    manager = models.ForeignKey('self', on_delete=models.SET_NULL, related_name=_('manger'), null=True)

现在,当我将此模型添加到管理站点并尝试更新员工时,用户可以将自己设置为自己的管理员。因此,如果我尝试更新员工ID#1,我不希望员工ID#1显示在经理下拉列表中。

附加问题

我知道我可以添加在我的更新表单中验证此条件的clean方法,但是我不知道如何获取当前对象ID以检查管理员ID。

forms.朋友

class EmployeeChangeForm(UserChangeForm):

   class Meta:
        model = Employee
        fields = '__all__'

   def clean_manager(self):
        # An Employee Cannot have himself assigned as a manager

        eID = ??  # how do i get the id of Current Employee here ?
        mgr = self.cleaned_data["manager"]
        if eID == mgr:
           raise forms.ValidationError("Employee and Manger should be diffrent !!")
        return mgr

上述方法不允许当前用户阻止员工将自己设置为他的经理,但员工仍将显示在经理字段的下拉列表中。如果当前员工根本没有显示在下拉列表中,我更愿意。

有没有办法做到这一点 ?

更新:

我刚刚了解了qazxsw poi,它将相关表中的特定集合的选择限制在一起。但是,我不知道如何将当前用户ID传递给该集合。

例如:

models.朋友

ForeignKey.limit_choices_to

上面的代码限制了我的经理选择除了3之外的所有经理。但我不知道如何使这个valie动态。

我不能做from django.db.models import Q class Employee(AbstractUser): manager = models.ForeignKey( 'self', on_delete=models.SET_NULL, related_name=_('manger'), null=True, limit_choices_to=~Q(id=3), ) limit_choices_to=~Q(id=self.pk)

请帮忙

答案

试试这个:

limit_choices_to=~Q(id=self.id)

不要忘记通过添加class EmployeeChangeForm(UserChangeForm): class Meta: model = Employee fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if self.instance.pk: self.fields['manager'].queryset = Employee.objects.exclude( pk=self.instance.pk, ) ModelAdmin中使用该表单。

以上是关于如何在Django的同一个表中阻止外键的相同对象引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在DJANGO里,向有外键的DB里插入数据

如何在 Codeigniter 中更新共享相同外键的多行

如何在 Django 管理页面中显示外键的属性

如何从特定数据库中的所有表中检索不属于主键和外键的所有列

使用带有外键的 Q 对象定义 django 查询集

django:如何从包含外键的多个模型中制作一个表单