如何为ElectionResult添加Vote StackedInline?解决admin.E202错误
Django Admin内联错误(admin.E202)解决方法
问题描述
为选举项目创建Django模型与后台配置后,尝试将VoteInline添加到ElectionResult模型中,方便投票代理填写各候选人得票数,却出现以下错误:
ERRORS: <class 'dashboard.admin.VoteInline'>: (admin.E202) fk_name 'party' is not a ForeignKey to 'dashboard.ElectionResult'
现有代码
class Election(models.Model): election_category = models.CharField(max_length=255) start_date = models.DateTimeField() end_date = models.DateTimeField() class PoliticalParty(models.Model): name = models.CharField(max_length=200) election = models.ForeignKey(Election, on_delete=models.CASCADE) class Candidate(models.Model): fullname = models.CharField(max_length=120) party = models.ForeignKey(PoliticalParty, on_delete=models.CASCADE) bio = models.TextField(blank=True, null=True) class PollingAgent(models.Model): candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE) election = models.ForeignKey(Election, on_delete=models.CASCADE) fullname = models.CharField(max_length=120) phone = models.IntegerField() email = models.EmailField() class Vote(models.Model): party = models.ForeignKey(Candidate, on_delete=models.CASCADE) votes= models.IntegerField() class ElectionResult(models.Model): polling_agent = models.ForeignKey(PollingAgent, on_delete=models.CASCADE) votes = models.ForeignKey(Vote, on_delete=models.CASCADE) uploaded_on = models.DateTimeField(auto_now_add=True) class VoteInline(admin.StackedInline): model = Vote extra = 0 admin.site.register(Vote) @admin.register(ElectionResult) class ElectionResultAdmin(admin.ModelAdmin): inlines = [ VoteInline, ]
解决方案
1. 修正模型关联逻辑
错误核心:Django内联模型要求子模型(Vote)必须包含指向父模型(ElectionResult)的外键,但当前Vote的外键指向Candidate,且ElectionResult与Vote的关联逻辑颠倒(一个选举结果应对应多个候选人得票,而非单个)。
修改Vote和ElectionResult模型:
class Vote(models.Model): candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE) # 重命名字段,避免与PoliticalParty混淆 votes = models.IntegerField() # 添加指向ElectionResult的外键,关联单个选举结果下的多个得票记录 election_result = models.ForeignKey(ElectionResult, on_delete=models.CASCADE, related_name='votes') class ElectionResult(models.Model): polling_agent = models.ForeignKey(PollingAgent, on_delete=models.CASCADE) uploaded_on = models.DateTimeField(auto_now_add=True) # 移除原有的单个Vote外键字段
2. 调整内联配置
现在Vote已包含指向ElectionResult的外键,可直接使用内联:
class VoteInline(admin.StackedInline): model = Vote extra = 0 # 若需明确指定外键,可添加 fk_name='election_result',Django通常可自动识别 @admin.register(ElectionResult) class ElectionResultAdmin(admin.ModelAdmin): inlines = [ VoteInline, ]
3. 数据库迁移
修改模型后执行以下命令更新数据库:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者meajagun
相关产品推荐
相关产品推荐

