You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:02:47