2012-01-25 4 views
4

데이터베이스의 장고 모델 인스턴스를 샘플 데이터를로드하는 데 사용할 수있는 샘플 Python 코드로 피클 링하는 방법은 무엇입니까?데이터베이스의 장고 모델 인스턴스를 샘플 데이터를로드하는 데 사용할 수있는 샘플 Python 코드로 피클 링하는 방법은 무엇입니까?

내가 원하는 :
1)()
을 이름을 블랭킹 내가 장고 프로젝트
2)이 스냅 샷을 가지고 그 안에 데이터를 수정하기위한 MySQL 데이터베이스에 저장된 수백 기록의 스냅 샷을 3)이 데이터를 새로운 사용자 계정에로드하는 데 사용할 수있는 "피클링 된 문자열"또는 실제 파이썬 코드로 변환하십시오.

내가 구현하려고하는 주요 기능은 현재 활성화 된 장고 웹 사이트 사용자 중 하나를 선택하고 데이터 일부를 익명으로 복사 한 다음 웹 사이트의 모든 새 사용자를위한 샘플 데이터로로드하므로 해당 데이터를 사용하여 시스템을 학습 할 수 있습니다.

+2

이 꽤 소리가 딕셔너리를 사용하여 새 모델 인스턴스를 만들려면, 당신은 뭔가를 할 수 있습니다 그것과 비슷합니다 ... https://docs.djangoproject.com/en/dev/howto/initial-data/ – Izkata

+0

장고는 JSON으로 데이터를 내보낼 수 있습니다. 장고 자신의 내부 직렬화로 작업하는 것이 훨씬 쉽습니다. 파이썬의'dumpdata'와'loaddata' 내장 명령을 사용하기 만하면 될까요? –

답변

10

쉽게 할 수있는 방법은 모델을 dict로 변환하는 것입니다. 그런 다음 간단히 피클 링 한 다음 다시 팽창시켜 새 모델 인스턴스를 만들 수 있습니다.

당신이 내장 장고 기능을 사용할 수 있습니다하는 딕셔너리로 ​​모델을 저장하려면 : 당신이 딕셔너리에 인스턴스를 변환하고 필요한 무엇 검열하면

from django.forms.models import model_to_dict 
my_dict = model_to_dict(my_instance,fields=[],exclude=[]) 

, 바로 정상 pickle.dumps를 사용하고 pickle.loads 데이터 저장 및 검색 방법 당신의 모델이 외래 키가있는 경우 1.8 이상이, 당신이 사용할 수있는

my_instance = MyModel(**my_dict) 
#add any customization for the new instance here 
my_instance.save() 
+5

외래 키가 포함되어있는 경우 dict에서 새 모델을 만들 수 없습니다. ValueError가 발생하기 때문에 –

1

장고 버전 :

my_dict = dict([(f.attname, getattr(instance, f.attname)) 
       for f in instance._meta.get_fields() 
       if hasattr(f, 'attname')])