首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何阻止Django中相同表中外键的相同对象引用?

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

Stack Overflow用户
提问于 2017-12-13 02:17:46
回答 1查看 431关注 0票数 0

我有一个模型,它有自己的外键。

models.py

代码语言:javascript
运行
AI代码解释
复制
class Employee(AbstractUser):
    manager = models.ForeignKey('self', on_delete=models.SET_NULL, related_name=_('manger'), null=True)

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

附加问题

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

forms.py

代码语言:javascript
运行
AI代码解释
复制
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

上述方法将不允许当前用户阻止员工将自己设置为其经理,但是,员工仍将显示在“经理”字段的下拉列表中。如果现在的员工根本没有出现在下拉列表中,我会更喜欢。

有办法吗?

更新:

我刚刚了解到ForeignKey.limit_choices_to,它将选择限制在相关表中的一个微粒集上。但是,我也不知道如何将当前的用户id传递给集合。

例如:

models.py

代码语言:javascript
运行
AI代码解释
复制
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),
)

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

我不能做limit_choices_to=~Q(id=self.pk)limit_choices_to=~Q(id=self.id)

请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 20:16:04

试试这个:

代码语言:javascript
运行
AI代码解释
复制
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来使用form = EmployeeChangeForm中的表单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47790517

复制
相关文章
map合并,相同键对应的值相加
最近在做统计钱的计算时遇到的一个需求,需要将一个大类别下的每一种钱进行特定的运算然后获得六年的钱,最后将这些钱按照年份进行汇总,获得总得大类型的六年的钱,在这个过程中采用了这种方法,每次算得钱放在map中,然后将map进行合并,写篇随笔mark下。
河岸飞流
2019/08/09
4K0
c++11:如何判断std::function对象相同?
我们知道std::function的实质就是个函数指针,但在c++11中std::function并没有实现操作符==(要到C++20才实现),所以我们无法使用==操作符来判断两个std::function对象是否相等,虽然我们明明知道它就是个指针。
10km
2020/04/08
1.8K0
在Java中如何把两个对象相同属性赋值
在Java编程中,我们经常需要把一个对象的属性复制到另一个对象。有多种方法可以实现这一目标,包括使用Java内置功能、使用第三方库如Apache Commons BeanUtils、或者使用Java 8的Streams API。下面我们会详细说明这几种方法。
很酷的站长
2023/09/21
2.9K0
在Java中如何把两个对象相同属性赋值
consul注册相同服务,相同程序,相同IP,不同端口来负载的问题
由于今天发现运维代码未正常发布。想要自己手动发布。发现原有服务名mos-x3-gls-service只有1个node启动,为了保障发布时原有服务不中断我需要再注册1个node,于是我简单修改了原有springboot端口9112为9113,启动后发现9113的节点正常注册,但是原来9112端口的节点服务没有了,搞了个寂寞。原因是如果在Spring Cloud Consul中使用相同的节点id进行注册,那么Consul将会将它们视为同一个节点,并将它们注册为同一个节点。老了,大意了。于是我把注册consul的节点id设置为服务名称+进程id即可解决。
高久峰
2023/06/17
5230
C# 存储相同键多个值的Dictionary
C盘下面有个根文件夹SaveFile,SaveFIle下面有两个子文件夹分别为,2018、2019,
用户7053485
2020/03/12
4.5K0
JS/TS 对数组中的对象按相同值进行分组
举个例子:对以下数组按 lastName 的值进行分组分类 const listData = [ { firstName: "Rick", lastName: "Sanchez", size: 18 }, { firstName: "Morty", lastName: "Smith", size: 6 }, { firstName: "Jerry", lastName: "Smith", size: 3 }, { firstName: "Beth", lastName: "Smith", s
Leophen
2020/10/09
8.2K0
JS/TS 对数组中的对象按相同值进行分组
相同的树
使用深度优先搜索,递归调用进行比较,若p,q节点不为null,优先比较当前节点值val,若相等则再次调用函数依次比较其left与right节点。
_kyle
2020/11/16
5680
list去除相同String、对象元素
一、当相同元素为String时 方法一 /** * List去重 */ private List<String> removeDuplicate(List<String> list) { LinkedHashSet<String> set = new LinkedHashSet<String>(list.size()); set.addAll(list); list.clear(); list.addAll(
崔笑颜
2020/06/08
8130
如何从 100 亿 URL 中找出相同的 URL?
来源 | https://doocs.github.io/advanced-java/ 题目描述 给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。 解答思路 每个 URL 占 64B,那么 50 亿个 URL占用的空间大小约为 320GB。 5, 000, 000, 000 * 64B ≈ 5GB * 64 = 320GB 由于内存大小只有 4G,因此,我们不可能一次性把所有 URL 加载到内存中处理。对于这种类型的题
程序猿DD
2023/04/04
2.9K0
如何从 100 亿 URL 中找出相同的 URL?
sql快速创建一张相同表结构的表
根据t_bond_basic_info表,创建表结构相同的表,取老表中的一部分字段t_bond_basic_info_new 后面的条件 where id>146000 创建的时候把id>146000的数据写到新表中,如果where 1<>1,只创建表结构,不把数据写进去
周小董
2019/03/25
3K0
表达谱数据中相同基因如何处理
在分析表达谱芯片的时候,我们经常会遇到多个探针对应同一个基因的情况。一般遇到这种情况,最常见的两种处理方法是
生信交流平台
2022/09/21
1.2K0
表达谱数据中相同基因如何处理
面试:如何从 100 亿 URL 中找出相同的 URL?
给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。
后端码匠
2020/09/07
4.6K0
java中map插入相同的key
测试用例: package test; import org.junit.Test; import po.Person; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; /** * Created by Administrator on 2015/9/16. */ public class TestMap { /** * map插入相同key问题,value会不会覆
Ryan-Miao
2018/03/13
2.4K0
CBO如何选择相同cost的索引
根据10053显示,可以看出,IDX_Z_01和IDX_Z_02这两个索引,cost相同,CBO会选择何种执行计划?
bisal
2019/01/30
9230
使用group by,having,count函数查询表中某字段相同内容的数据
思路:使用group by分组,再用count计算每组的个数,最后用having比较计算后的值大于1的数据。
全栈程序员站长
2021/07/19
3.9K0
100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { /** 递归就完事了 同时比较他两个的右节点&&他两个的左节点 同时为空 说明到了头返回空 一
CaesarChang张旭
2022/05/06
4590
100. 相同的树
mysql过滤表中重复数据,查询表中相同数据的最新一条数据
先对表按照时间desc排序,在查询该层使用group by 语句,它会按照分组将你排过序的数据的第一条取出来
安德玛
2022/03/09
5.5K0
对 list 中的相同数据进行分组
同一组数据分组 需求:一个 list 里可能会有出现一个用户多条数据的情况。要把多条用户数据合并成一条。 思路:将相同的数据中可以进行确认是相同的数据,拿来做分组的 key,这样保证不会重。 实际中使用,以用户数据为例,可能用户名和身份证号是不会变的,用这两个条件拼接起来。
潇洒
2019/06/28
5.7K0
面试:如何从 100 亿 URL 中找出相同的 URL?
给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。
开发者技术前线
2020/11/24
2.3K0
面试:如何从 100 亿 URL 中找出相同的 URL?
点击加载更多

相似问题

如何更新Django中外键引用的表中的值

15

如何检查Django中外键引用的对象的特定属性

13

如何访问django表中外键的值?

15

查看SSMS中外键引用的所有表

11

计数Django中外键和ManyToMany中的对象

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文