2013-04-22 3 views
2

특정 모델에 대한 개체 집합을 쿼리하고 단일 특성/열 ("account")을 변경 한 다음 전체 쿼리 집합의 개체를 새 개체/행으로 저장해야합니다. 즉, 복제본에서 단일 속성 ("계정")을 변경하여 객체를 복제하려고합니다. 나는 기본적으로 새 계정을 만든 다음 각 모델을 살펴보고 이전 계정의 개체를 새 계정에 복사하므로 다른 모델을 사용하여이 작업을 반복적으로 수행 할 것입니다. 아마도 장고 셸을 사용하고있을 것입니다. 어떻게 접근해야합니까? 그것은 queryset 수준에서 할 수 있습니까 아니면 모든 개체를 통해 루프해야합니까? 즉쿼리 세트를 수정하고 새로운 오브젝트로 저장하는 방법?

docs에서

MyModel.objects.filter(account="acct_1") 
# Now I need to set account = "acct_2" for the entire queryset, 
# and save as new rows in the database 
+0

나는 혼란 스럽다고 생각합니다. 개체를 복제하고 새 계정을 설정 하시겠습니까? – bozdoz

+0

예. 죄송합니다. 더 명확하게하기 위해 다시 한 번 말씀 드리겠습니다. –

+0

일괄 적으로 업데이트 할 수 있지만 일괄 적으로 삽입 할 수는 있지만 한 줄로 대량 업데이트하거나 새로 만들 수는 없습니다. 쿼리 세트를 반복해야합니다. –

답변

1

: 개체의 기본 키 속성을 설정하지 않으면

, 또는이 설정되어 있지만 기록이 존재하지 않는 경우는, 장고는 INSERT를 실행 .

그래서 당신이 그것을 작동합니다 없음으로 id 또는 pk을 설정하지만 SO에이 솔루션에 대한 응답을 충돌 본 적이있는 경우 : Duplicating model instances and their related objects in Django/Algorithm for recusrively duplicating an object

이 솔루션은 (수정 주셔서 감사합니다 @JoshSmeaton)를 작동합니다 :

내 경우에 생각
models = MyModel.objects.filter(account="acct_1") 
for model in models: 
    model.id = None 
    model.account = "acct_2" 
    model.save() 

, 나는에 테스트하고있어 모델에 OneToOneField, 그래서 내 시험이 기본 솔루션과 함께 작동하지 않을 것이라고 의미가 있습니다. 하지만 OneToOneField를 돌보는 한 제대로 작동해야한다고 생각합니다.

+0

하지만 이전 개체를 저장하지 않을까요? –

+0

예. 나는 그 질문에 혼란스러워했다. 사과 @BenRoberts – bozdoz

+0

이것은 필드를 무시합니다. – Ahsan

관련 문제