1

私は標準的な方法で2つのモデルに多対多の関係を設定しています。

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'

基本的に、1人のユーザーがスワップする2つのアイテムを選択したときに、そのアイテムがいずれかのユーザーボードにある場合、スワップが発生するはずです。

4

2 に答える 2

1

だから私は自分が間違っていたことを理解しました。

どうやら、このような場合、「スルー」モデルを通じて、多対多の関係自体に何らかの操作を行う必要があるようです。(だから名前なのかな?) これは、django のドキュメントがこれについて言おうとしていたことだと思います.. :/

だから私はそれを次のように整理しました:

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

それはかなりうまくいきます。これが他の誰かに役立つことを願っています。

于 2013-02-07T15:27:18.043 に答える
-1

これがあなたにとって正しい答えになるかどうかはわかりませんが、アイテム自体ではなく、マネージャー オブジェクトから削除しようとしているようです。

これをテストする時間はありませんが、.all() を最後に追加してみてください。

ボード = UserSet.objects.filter(uuid=board_uuid)

これは、マネージャーを返すだけでなく、実際にアイテムを引き出します。テンプレートで少し前に同様の問題があり、それが役に立ちました。

于 2013-02-07T09:33:51.347 に答える