如何在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的同一个表中阻止外键的相同对象引用?的主要内容,如果未能解决你的问题,请参考以下文章