如何在没有迭代的情况下为查询集删除多对多的对象?

时间:2017-02-09 18:08:46

标签: django django-models many-to-many

在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)

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

更新:

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

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'

更新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]

1 个答案:

答案 0 :(得分:4)

你可以使用这样的东西

no

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

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

然后,您可以在删除

中将多个元素作为参数
user.conversations.clear()

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