2013-02-07 3 views
1

두 가지 모델에 표준 방식으로 다 대다 관계 설정이 있습니다.Django : 많은 관계가 많은 관계로 교환하기

class UserSet(models.Model): 
    name = models.CharField(max_length=256) 
    items = models.ManyToManyField(Item, blank=True, through='ItemUserSet') 

class ItemUserSet(models.Model): 
    set = models.ForeignKey(UserSet) 
    item = models.ForeignKey(Item) 
    order = models.IntegerField() 

기본적으로 많은 항목이 있으며 사용자 수에 관계없이 개인 목록에 대한 항목 집합을 만들 수 있습니다.

사용자가 목록의 항목을 다른 사람과 바꿀 수 있도록하려는 경우이 작업은 한 사용자가 교체 한 항목을 가지고있는 다른 사용자의 목록에도 스왑을 수행합니다.

orig_item = Item.objects.get(uuid=orig_uuid) 
repl_item = Item.objects.get(uuid=repl_uuid) 
board_uuid = request.GET['board'] or None 

board = UserSet.objects.filter(uuid=board_uuid) 
ius = ItemUserSet.objects.filter(item__uuid=orig_uuid) 

for u_set in board: 
    u_set.items_set.remove(orig_item) 
    u_set.items_set.add(repl_item) 
    c['msg']='OK' 
for sets in ItemUserSet: 
    sets.item = repl_item.pk 
    sets.save() 

그러나 이것은 작동하지 않습니다. 이 오류가 발생합니다. 한 사용자가 해당 항목은 모든 사용자 보드에있는 경우, 교환하는 두 항목을 선택할 때

'ManyRelatedManager' object has no attribute 'remove' 

는 기본적으로 스왑이 발생한다.

답변

0

그래서 나는 잘못하고있는 것을 알아 냈습니다.

분명히 이런 경우에는 "through"모델을 통해 manytomany 관계 자체에 대한 조작을 수행해야합니다. (따라서 아마 이름은?) 내가 장고 문서는 이것에 대해 말하려고했는지 먹으 렴 생각 는 .. :

for s in ius: 
    s.item = repl_item 
    s.save() 

꽤 잘 작동 :/

그래서 내가하여 정리. 희망이 다른 사람을 도와줍니다.

0

이것이 올바른 답이 될지 확실하지 않지만 관리자 개체에서 삭제하려고하는 것처럼 보이며 항목 자체는 삭제하지 않는 것 같습니다.

나는 이것을 테스트 할 시간이 없어,하지만 당신은 아마

보드 = UserSet.objects.filter (UUID = board_uuid)의 끝 부분에 .ALL()를 넣어하려고하면

사실 관리자가 아닌 항목을 가져옵니다. 필자는 템플릿에서 비슷한 문제를 겪었으므로 저를 도왔습니다.

+0

감사하지만 작동하지 않았습니다. 나는 해결 방법을 찾았지만 .. 내 대답을 참조하십시오. –

관련 문제