2011-11-30 1 views
0

Goal이라는 모델과 Action이라는 모델이 있습니다. 여기서 중요한 부분을 강조합니다 :Django - 개체를 deserialize ManyToMany 필드

class Goal(models.Model): 
    leaders = models.ManyToManyField(User, null=True) 

class Action(models.Model): 
    before = models.TextField(null=True) 
    after = models.TextField(null=True) 

사용자가 목표를 편집 할 때 새로운 Action 객체를 저장합니다. 이 Action 객체의 속성 중 하나는 전후입니다. 전후는 직렬화 된 Goal 객체입니다. 나중에 Goal 개체에서 변경된 내용을 기록하는 데 사용됩니다.

before = action.before 
for obj in serializers.deserialize("xml", before): 
    before_object = obj 
after = action.after 
for obj in serializers.deserialize("xml", after): 
    after_object = obj 

과 함께 지도자 필드를 액세스하려고 : 내가 가진 목표 객체를 직렬화 할 때

모든 속성 (제목과 설명 등) 잘 작동이 문제는, '지도자'라는 ManyToMany 필드입니다 :

before_object_leaders = before_object.object.leaders.all() 
after_object_leaders = after_object.object.leaders.all() 
leaders_updated = True 
if set(before_object_leaders) == set(after_object_leaders): 
    leaders_updated = False 

before_object_leaders 현재 목표 개체에 대한 목표 테이블의 값, 그리고 내가 원하는 것입니다 직렬화 복원 된 객체의 값을 가져옵니다. (이전 값, 업데이트 전)

제발, 제발 미치겠습니다. 감사!

답변

0

before_object.object.leaders 전화를하는 즉시 문제는 all() 메서드를 호출 할 때 새 DB 쿼리를 만드는 ModelManager를 얻게됩니다! ModelManager의 기본 동작입니다.

그래서 문제를 해결하려면 Model 객체 내에 새 관리자를 작성해야합니다. 이 관리자는 리더의 비 직렬화에 책임이 있습니다.

https://docs.djangoproject.com/en/dev/topics/db/managers/

+0

야, 덕분에 많은 아서 : 여기

는 일부 참조입니다! 귀하의 의견에 문제가 있음을 깨달았습니다. 저는 장고를 처음 사용했기 때문에 리더를 몰랐습니다 .all()은 실제로 db에 다시 쿼리했습니다. :) – thyagx