Python/Django报错fk_name 'id'不是candidates_info的外键问题求助
报错中文翻译
<class 'votenow.admin.addressInline'>: (admin.E202) 你配置的fk_name值id,并不是address模型中指向votenow.candidates_info模型的外键字段
问题根源
- 外键关系方向与Inline使用要求不符
Django Admin的Inline组件(包括TabularInline、StackedInline)的作用是在父模型的编辑页面直接编辑关联的子模型数据,要求子模型必须存在一个指向父模型的外键字段。你当前的模型定义中,是在candidates_info(父模型)里定义了外键addr指向address(子模型),关系方向完全相反,不满足Inline的使用前提。 fk_name配置错误id是Django模型默认生成的主键字段,本身不具备外键关联属性,你将它设置为fk_name的值,自然无法匹配到指向candidates_info的外键。
解决方案(按业务场景二选一)
场景1:需要实现「一个候选人关联多个地址」的逻辑
适合用Inline在候选人编辑页直接管理所有关联地址,按以下步骤修改:
- 调整
models.py的外键定义
class candidates_info (models.Model): last_name = models.CharField(max_length=50) first_name = models.CharField(max_length=50) middle_name = models.CharField(max_length=50) moniker = models.CharField(max_length=35) registration_dt = models.DateTimeField('date registered') # 删除原有addr外键字段 class address(models.Model): # 新增指向candidates_info的外键字段 candidate = models.ForeignKey(candidates_info, on_delete=models.CASCADE, related_name="addresses") lot_no = models.DecimalField(max_digits=5, decimal_places=0) block_no = models.DecimalField(max_digits=5, decimal_places=0)
- 调整
admin.py的Inline配置
from django.contrib import admin from .models import candidates_info, address class addressInline(admin.TabularInline): model = address # 子模型只有一个指向父模型的外键时,fk_name可省略,Django会自动识别 # fk_name = "candidate" @admin.register(candidates_info) class candidates_infoAdmin(admin.ModelAdmin): fields =['last_name', 'first_name', 'middle_name', 'moniker'] inlines = [addressInline]
修改后执行makemigrations和migrate命令更新数据库结构即可。
场景2:需要实现「一个地址关联多个候选人」的逻辑
这种场景不需要使用Inline,直接把外键字段放到父模型的编辑字段列表即可,Django默认会生成下拉选择框供你选择关联的地址:
# 直接修改admin.py,删除所有addressInline相关配置 from django.contrib import admin from .models import candidates_info @admin.register(candidates_info) class candidates_infoAdmin(admin.ModelAdmin): # 把addr字段加入编辑列表 fields =['last_name', 'first_name', 'middle_name', 'moniker', 'addr']
内容的提问来源于stack exchange,提问作者Zyr.bLi
相关产品推荐
相关产品推荐

