如何在不迭代的情况下从查询集中的多对多中删除对象?

B.A*_*ler 5 django many-to-many django-models

在 Django 中,两个模型之间存在多对多关系。

我想从 model_two 的多个实例中删除 model_one 的实例。

我有:

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

这需要评估对话的每个实例。有没有一种方法可以在不迭代的情况下做到这一点?

更新:

添加模型以增加问题的清晰度。

class User(EditMixin):
    conversations = models.ManyToManyField('Conversation', related_name='users')
    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'
Run Code Online (Sandbox Code Playgroud)

更新2:

我认为我的问题不清楚。clear() 方法删除 m2m 字段中的所有项目。我想做的是:

我有一个 User 对象的查询集。每个都有一个包含对话的 m2m 字段。查询集中的每个项目在 m2m 字段中都有对话 7,但也包含其他对话。我只想从查询集中每个对象的 m2m 中删除对话 7,同时保留其他对话。所有这些,如果可能的话,无需迭代,例如

前:

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

蒂芙尼.对话:[3,7,9]

Jeff.对话:[5,6,7]

后:

杰里米.对话:[1,2,3,4]

蒂芙尼.对话: [3, 9]

杰夫.对话:[5, 6]

ikl*_*nac 4

你可以使用这样的东西

user = User.objects.get(id=user_id)
user.conversation_set.clear()
Run Code Online (Sandbox Code Playgroud)

如果它来自多对多的另一端(编辑后适用于您的解决方案)

user.conversations.clear()
Run Code Online (Sandbox Code Playgroud)

然后,您可以将多个元素作为删除中的参数

user.conversations.remove(*conversations)
Run Code Online (Sandbox Code Playgroud)

或使用 .through 访问数据透视表并从中删除