Django中使用.filter关联查询Worker与Machine位置映射时代码未执行问题排查求助
首先,你的代码里有几个关键问题导致后续逻辑没有执行,甚至可能悄悄抛出了异常(只是你没看到),我们一步步拆解:
1. 核心错误:self.object不存在
你写的machine_position = self.object.filter(...)这一行是完全错误的——Django的模型实例(比如self代表的Worker对象)并没有object这个属性,正确的做法应该是利用Worker和Machine的多对多关系直接筛选,而不是调用不存在的self.object。
这一行代码会触发AttributeError: 'Worker' object has no attribute 'object',但因为你是在Admin的readonly_fields里使用这个属性,Django Admin可能悄悄捕获了这个异常,导致后续的print(machine_position)根本没机会执行,也没有报错提示。
2. 逻辑偏差:返回的是位置ID而非机器ID
你原本的循环里MachineID = event.position.square_id,这是在收集位置的ID,而不是你需要的machine_id,完全偏离了需求。
3. 优化建议:利用多对多关系提升查询效率
既然Worker和Machine已经通过Machine_of_Worker建立了多对多关系,直接从self.Machine_of_Worker里筛选位置匹配的机器即可,不需要查询所有Machine表,这样更高效。
修正后的代码
把你的@property方法改成下面这样:
@property def worker_on_machine(self): # 先判断Worker是否有绑定位置,避免空指针异常 if not self.position: return "未绑定位置" actual_position_id = self.position.square_id # 从当前Worker关联的机器中,筛选位置匹配的记录 matching_machines = self.Machine_of_Worker.filter(position__square_id=actual_position_id) # 将符合条件的machine_id拼接成字符串返回 return ", ".join(str(machine.machine_id) for machine in matching_machines)
然后在WorkerAdmin里确保你的配置正确(注意元组的逗号,否则会报错):
class WorkerAdmin(admin.ModelAdmin): readonly_fields = ['worker_on_machine'] list_display = ('position',) # 这里必须加逗号,否则会被解析为字符串而非元组 fields = ['personal_id', 'Machine_of_Worker', ('position','worker_on_machine')]
验证逻辑
修正后的代码会:
- 先检查当前Worker是否有绑定位置,如果没有直接返回提示
- 获取Worker的位置ID,然后从该Worker关联的所有机器中,筛选出位置ID相同的机器
- 把这些机器的
machine_id拼接成逗号分隔的字符串返回,完全符合你的需求
现在你再访问Worker记录,应该就能看到正确的机器ID列表了,控制台的打印也能正常输出(如果保留print的话)。
内容的提问来源于stack exchange,提问作者Falk

