如何通过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
相关产品推荐
相关产品推荐

