2017-02-09 7 views
2

Djangoでは、私は2つのモデルの間に多対多の関係があります。繰り返しを使わずにクエリーセットのオブジェクトを多対多から削除するにはどうすればよいですか?

model_toneの複数のインスタンスからmodel_oneのインスタンスを削除します。

私が持っている:

user = User.objects.get(id=user_id) 
conversations = Conversation.objects.filter(users=user) 
for conversation in conversations.iterator(): 
    conversation.users.remove(user) 

これは会話のすべての単一のインスタンスを評価する必要があります。繰り返しなしでこれを行う方法はありますか?

更新日:

質問を明確にするモデルを追加しました。

class User(EditMixin): 
    conversations = models.ManyToManyField('Conversation', related_name='user_conversation') 
    name = models.CharField(max_length=255, blank=True, null=True) 
    permalink = models.URLField(blank=True, max_length=2083) 
    rating = models.DecimalField(decimal_places=2, max_digits=4, blank=True, default=0) 
    remote_id = models.CharField(max_length=4096, blank=True, null=True) 
    summary = models.CharField(max_length=255, blank=True, null=True) 

    objects = UserManager() 

class Meta: 
    verbose_name_plural = 'Users' 


class Conversation(EditMixin, BasicInfoMixin): 
    content = models.TextField(blank=True, null=True) 
    update_enabled = models.BooleanField(default=False) 

    objects = ConversationManager() 

class Meta: 
    verbose_name_plural = 'Conversations' 

UPDATE 2:

私は私の質問は不明だと思います。 clear()メソッドは、m2mフィールド内のすべての項目を削除します。私がしたいのは以下の通りです:

私はUserオブジェクトのクエリーセットを持っています。それぞれには会話のあるm2mフィールドがあります。クエリーセット内のすべてのアイテムは、m2mフィールドに対話7がありますが、他の会話も含まれています。他の会話を維持しながら、クエリーセット内のすべてのオブジェクトのm2mから会話7を削除したいだけです。可能であれば、これをすべて繰り返します。

前:

Jeremy.conversations:[1、2、3、4、7]

Tiffany.conversations:[3、7、9]

Jeff.conversations:[5 、6、7]

後:

Jeremy.conversations:[1、2、3、4]

Tiffany.conversations:[3]、[9]

Jeff.conversations:[5、6]

答えて

3

あなたは(多くの多くにこの

user = User.objects.get(id=user_id) 
user.conversation_set.clear() 

それならばもう一方の端からのようなものを使用することができます

user.conversations.clear() 

あなたはその後、削除で引数として複数の要素を持つことができ、編集後のあなたのソリューション)に適用

user.conversations.remove(*conversations) 

またはピボットテーブルにアクセスし、そこから

+0

を削除する.through使用し、あなたのモデル定義に入れることができ – iklinac

+0

それはとてもあなたがほとんど – iklinac

+1

を以下使用する必要がありますジャンゴには多くの関係に多くの他の終わりですが、得ました私は正しい答えに私。どうもありがとうございます! あなたが 'conversation.users.remove(* users)'としてそれを置くと、それは私に欲しいものが与えられます –

関連する問題