2017-02-09 56 views
2

在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='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' 

更新2:

我想我的問題是不清楚。 clear()方法刪除m2m字段中的所有項目。我想要做的是以下幾點:

我有一個用戶對象的查詢集。每個人都有一個有對話的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() 

然後,您可以有多個元素ARGS中刪除

user.conversations.remove(*conversations) 

或使用。通過訪問數據透視表,並刪除它

+0

你可以把你的模型定義 – iklinac

+0

這是在Django一對多的關係很多的另一端,你應該使用以下 – iklinac

+1

差不多,但你有我向正確的答案。非常感謝! 如果你把它作爲'conversation.users.remove(*用戶)'它給了我我想要的東西 –

相關問題