2017-02-09 9 views
2

В Django у меня есть много разных отношений между двумя моделями.Как удалить объект из множества во многие для набора запросов без итерации?

Я хочу удалить экземпляр model_one из нескольких экземпляров model_two.

у меня есть:

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

Это необходимо для оценки каждого отдельного экземпляра разговора. Есть ли способ сделать это без итерации?

UPDATE:

Добавлены модели, чтобы добавить ясность в этот вопрос.

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. Я хотел бы сделать следующее:

У меня есть запрос объектов пользователя. Каждый из них имеет поле m2m с цепочками. Каждый элемент в наборе запросов имеет разговор 7 в поле m2m, но также содержит другие разговоры. Я хочу только удалить разговор 7 из m2m каждого объекта в наборе запросов, сохраняя другие разговоры. Все это, без возможности повторения, например,

перед:

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

вы можете положить в модели определений – iklinac

+0

Это другой конец отношения многие ко многим в Django, так что вы должны использовать следующие – iklinac

+1

Почти, но вы получили я к правильному ответу. Спасибо огромное! Если вы положили его как 'convers.users.remove (* users)', он дает мне то, что я хотел –