【问题标题】:Django deserialization of a natural key that contains another natural key包含另一个自然键的自然键的 Django 反序列化
【发布时间】:2013-01-21 00:14:19
【问题描述】:

我正在创建一个记录玩家统计数据的模型。
通过首先手动输入数据点,我可以让 Django 使用 dumpdata --natural 将带有自然键的数据序列化到一个 json 文件中。 我的计划是复制这种序列化格式以大量插入其他数据点;问题是 Django 不会使用loaddata 将 json 反序列化回数据库。抛出的错误是

DeserializationError: int() 参数必须是字符串或数字,而不是“列表”

我已经稍微简化了抱怨的 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)
    # ...

非常感谢任何输入,谢谢!

【问题讨论】:

    标签: django deserialization natural-key


    【解决方案1】:

    我遇到了完全相同的(棘手的)问题,并设法以这种方式解决了它。您需要更改get_by_natural_key 方法,使其接受您在Player.natural_key() 中使用的team.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 自动处理此问题的解决方案,我会很高兴听到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2012-09-16
      • 2012-12-31
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多