How to override a related set's "add" method in Django
I a开发者_JS百科m working on a Django project and I want to send a signal when something gets added to some model's related set. E.g. we have an owner who has a set of collectables, and each time the method owner.collectable_set.add(something)
is getting called, I want a signal like collectable_added
or something. Signals are clear to me, but I don't know which manager(?) contains the "add" method that I want to override.
Edit for Xavier's request to provide more details: you can easily override a model’s save
method, by simply defining it and calling the "super-save
" so it gets properly saved with some extra functionality. But I wonder where to override a related set's add
method.
Gosh, I think I haven't brought in any further details, but I think it should be clear what I want to do even from the first paragraph.
Edit 2: This is the method I want to override. Is it recommended to do so, or do you suggest another way to place the sending of the signal?
This is the solution I found, the m2m_changed
signal. Took me quite some searching and reading. Furthermore, I found out that it is not trivial to extend the ManyRelatedManager
class, which would have been the other option. But with the m2m_changed
signal I can rely on built-in functions which is the preferred way most of the time.
I think you're looking for the RelatedManager Class.
After much searching (thanks to this Paul's hint), I came across this snippet that helped to explain the m2m_changed implementation to intercept not override the add method on the ManyRelatedManager. It appears that the manager on a many-to-many relationship happens on the fly, so it's not trivial to override the method.
精彩评论