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

Django关联模型(through model)Fixture加载失败,报值需为整数错误

为啥会报错?

Django加载Fixture时,默认认为外键字段得传主键(整数类型),但你生成的Fixture里,person和group字段用的是它们的名称(也就是natural key),Django没自动识别到要用natural key去匹配对应的关联对象,所以就报错说“必须是整数”。

解决办法

办法1:修改模型外键配置

直接修改Membership模型里的外键字段,明确指定关联到Person和Group的name字段(毕竟name是唯一的,能唯一标识对象):

class Membership(models.Model):
    # 加to_field参数,告诉Django外键关联的是name字段
    person = models.ForeignKey(Person, on_delete=models.CASCADE, to_field='name')
    group = models.ForeignKey(Group, on_delete=models.CASCADE, to_field='name')
    joined_on = models.DateTimeField(auto_now_add=True)

    objects = MembershipManager()

    def natural_key(self):
       return self.person.name, self.group.name

改完之后跑一遍迁移,再用你原来的m.json加载就行——前提是数据库里已经有对应的Person和Group数据。

办法2:把关联模型的Fixture一起导出加载

不想改模型的话,就把Person、Group和Membership的Fixture导出到同一个文件里,这样加载时Django会先创建Person和Group,自然就能识别Membership里的名称对应的对象了:

  1. 导出全部关联数据:
python manage.py dumpdata room.Person room.Group room.Membership --natural-foreign --natural-primary > all_room_data.json
  1. 加载这个合并后的文件:
python manage.py loaddata all_room_data.json

办法3:分步加载Fixture

如果你已经有单独的Person和Group Fixture文件,先加载这两个,再加载Membership的:

# 先加载Person和Group的数据
python manage.py loaddata person.json group.json
# 再加载Membership
python manage.py loaddata m.json

验证一下

加载完之后,可以进Django shell确认数据是否正确:

from room.models import Membership
membership = Membership.objects.get(person__name="Dave Johnson")
print(membership.group.name)  # 正常应该输出"Django Learning"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:34