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里的名称对应的对象了:
- 导出全部关联数据:
python manage.py dumpdata room.Person room.Group room.Membership --natural-foreign --natural-primary > all_room_data.json
- 加载这个合并后的文件:
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
相关产品推荐
相关产品推荐

