Django removendo objeto do relacionamento ManyToMany

112

Como eu excluiria um objeto de um relacionamento Muitos para Muitos sem remover o objeto real?

Exemplo:

Eu tenho os modelos Moodse Interest.

Moodtem um campo muitos para muitos interests(que é a models.ManyToManyField(Interest)).

Eu crio uma instância de Moodschamada my_mood. No my_moodscampo de interesses de eu tenho my_interest, o que significa

>>> my_mood.interests.all()
[my_interest, ...]

Como faço para remover my_interesta partir my_moodsem excluir qualquer instância de modelo? Em outras palavras, como removo o relacionamento sem afetar os modelos relacionados?

Nachshon Schwartz
fonte

Respostas:

183
my_mood.interests.remove(my_interest)

Documentos de Relações do Django

Nota: você pode ter que obter uma instância my_moode my_interestusar a API QuerySet do Django antes de executar este código.

DrTyrsa
fonte
3
AttributeError: 'RelatedManager' object has no attribute 'remove'
Cerin
1
para adicionar outroentry my_mood.interests.add(my_interest)
Zohab Ali
65

Se você precisar remover todas as referências M2M sem tocar nos objetos subjacentes, é mais fácil trabalhar na outra direção:

interest.mood_set.clear()

Embora isso não trate diretamente da pergunta do OP, costuma ser útil nessa situação.

shacker
fonte
10
Por que isso foi rejeitado? Concedido, não aborda especificamente a pergunta do OP, mas deixei a resposta porque é de interesse específico para pessoas que lutam para remover relações em contextos M2M e remove a necessidade de percorrer as instâncias. Achei que fosse uma dica relacionada útil.
shacker de
2
Isso foi útil para mim (eu estava prestes a fazer um loop e não queria). Obrigado por postar!
bwv549
1
poderia ser melhor se você simplesmente adicionar este ponto na resposta acima
brainLoop
1
Ou com nome relacionado em modelos einterest.relatedname.clear()
Josh
11

No seu caso, você pode simplesmente limpar o relacionamento

my_mood.interests.clear()

Então, talvez quando você estiver criando uma nova relação em seu serializador, você pode fazer algo assim

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
Sabyasachi
fonte