Django:交换元素的多对多关系

时间:2013-02-07 07:53:57

标签: python django many-to-many django-orm

我通过标准方式在两个模型上设置了多对多的关系。

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'

基本上当一个用户选择要交换的两个项目时,如果该项目存在于任何用户板中,则应该进行交换。

2 个答案:

答案 0 :(得分:1)

所以我弄清楚我做错了什么。

显然,在这样的情况下,你需要通过“通过”模型对多种关系本身进行任何操作。 (因此可能是这个名字?) 我想这就是django docs试图对此说些什么..:/

所以我把它整理出来:

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

它工作得很好。希望这有助于其他人。

答案 1 :(得分:-1)

我不确定这对你来说是否是正确的答案,但似乎你试图从经理对象中删除而不是项目本身。

我没有时间对此进行测试,但如果您尝试将.all()放到

的末尾。
  

board = UserSet.objects.filter(uuid = board_uuid)

实际上会提取项目,而不仅仅是退回经理。 前段时间我在模板中遇到过类似的问题,这对我很有帮助。