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?

Respostas:



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.


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()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.