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

如何通过Ajax在Django中创建外键对象 解决Model.Foo必须为Bar实例报错

报错原因

Vote模型的poller字段是外键类型,创建Vote实例时必须传入Poller类的实例对象,你当前直接传入了poller_id这个ID值,触发类型不匹配错误。

修复方案

你已经在视图中提前查询到了对应Poller实例,直接修改创建Vote实例的代码即可:

# 把原来的 poller=poller_id 替换为你已经查出来的poller实例
vote_object = Vote(poller=poller, user=user, poller_choice_one_vote=True)

也可以选择直接给外键的ID字段赋值,不需要传入实例:

vote_object = Vote(poller_id=poller_id, user=user, poller_choice_one_vote=True)

其他优化建议

  • 查询Poller时建议使用get_object_or_404替代原生get,避免投票不存在时直接抛出500错误:
    from django.shortcuts import get_object_or_404
    poller = get_object_or_404(Poller, poller_id=poller_id)
    
  • 新增登录状态校验,避免匿名用户访问接口时外键赋值报错
  • 新增重复投票校验,避免同一用户对同一个投票提交多次记录
  • 当前代码固定写死了poller_choice_one_vote=True,建议读取Ajax提交的vote参数判断用户的实际投票选项,适配两个选项的投票场景

内容的提问来源于stack exchange,提问作者JSRB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:24:03