2013-01-21 2 views
0

플레이어 통계를 기록하는 모델을 생성 중입니다.
수동으로 데이터 포인트를 입력하면 Django에서 자연 키가있는 데이터를 dumpdata --natural을 사용하여 json 파일로 직렬화 할 수 있습니다. 이 직렬화 된 형식을 복사하여 다른 데이터 요소를 대량 삽입하는 것이 계획입니다. 문제는 Django가 loaddata을 사용하여 json을 다시 데이터베이스로 역 직렬화하지 않는다는 것입니다. 발생 오류가 나는 불평 JSON 데이터를 조금 단순화했지만 그것은 다음과 같습니다Django 다른 자연 키가 포함 된 자연 키의 비 직렬화

DeserializationError: int() argument must be a string or a number, not 'list'

입니다 :
{"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) 
    # ... 

모든 입력 대단히 감사합니다, 감사합니다!

답변

1

나는 똑같은 (까다로운) 문제가 있었고 이런 식으로 해결할 수있었습니다. Player.natural_key() 안에 사용 된 team.natural_key()에 의해 암시 적으로 주어진 2 개의 인수를 허용하도록 get_by_natural_key 메서드를 변경해야합니다. 이것을 시도하십시오 :

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) 

장고가 이것을 자동으로 처리하는 다른 해결책을 찾은 경우, 나는 그것을 듣기 때문에 기쁠 것입니다.