我正在创建一个记录玩家统计数据的模型
通过首先手动输入数据点,我可以让Django使用自然键将数据序列化为json文件,使用dumpdata --natural
就可以了。
我的计划是复制这个序列化格式以批量插入其他数据点;问题是Django不会使用loaddata
将json反序列化回数据库。引发的错误是
DeserializationError:int()参数必须是字符串或数字,而不是'list'
我简化了抱怨的json数据,但它看起来像这样:
{"pk": 1, "model": "nba.metric", "fields": {"player": ["Kobe Bryant", ["Lakers", 2012]]}}
我的模特是这样的:
class TeamManager(models.Manager):
def get_by_natural_key(self, name, season):
return self.get(name=name, season=season)
class Team(models.Model):
name = models.CharField(max_length=20)
season = models.IntegerField()
class Meta:
unique_together = ('name', 'season')
objects = TeamManager()
def natural_key(self):
return (self.name, self.season)
class PlayerManager(models.Manager):
def get_by_natural_key(self, name, team):
return self.get(name=name, team=team)
class Player(models.Model):
name = models.CharField(max_length=100)
team = models.ForeignKey(Team)
class Meta:
unique_together = ('name', 'team')
objects = PlayerManager()
def natural_key(self):
return (self.name, self.team.natural_key())
class Metric(models.Model):
player = models.ForeignKey(Player)
# ...
非常感谢任何输入,谢谢!
答案 0 :(得分:2)
我有完全相同(棘手)的问题,并设法以这种方式解决它。您需要更改get_by_natural_key
方法,以便它接受您在team.natural_key()
内使用的Player.natural_key()
隐含的2个参数。试试这个:
class PlayerManager(models.Manager):
def get_by_natural_key(self, name, team_name, team_season):
return self.get(name=name, team__name=team_name, team__season=team_season)
如果你找到了另一个Django自动处理这个问题的解决方案,我很乐意听到它。