@1099511627776
Пишу все что интересно и на всем на чем интересно

Как правильно заполнять в Django ManyToMany field в тригере post_save?

Здравствуйте, пытаюсь заполнить ManyToMany поле в триггере post_save Приблизительный код выглядит следующим образом:
@receiver(post_save, sender=Post, dispatch_uid='update_post_images')<br>
def update_post_images(sender, instance, using, **kwargs):<br>
   post_save.disconnect(update_post_images, sender=Post, dispatch_uid='update_post_images')<br>
   print 'before', instance.images.all()<br>
   img = Image.object.get(pk=1469)<br>
   instance.images.add(img)<br>
   print 'after', instance.images.all()<br>
   post_save.connect(update_post_images, sender=Post, dispatch_uid='update_post_images')<br>


Теперь я в консольке сервера вижу все как и должно быть т.е.
print 'before', instance.images.all() - выводит одно изображение
print 'after', instance.images.all() - выводит 2 (старое и то которое добавил)

Но после того как тригер отработал - ничего не изменяется
т.е. в manage.py shell по запросу Post.objects.get(pk=.....).images.all() - я вижу все тот же ОДИН объект (и в админке- тоже)

Пожалуйста помогите решить проблемку.
  • Вопрос задан
  • 2770 просмотров
Решения вопроса 1
@1099511627776 Автор вопроса
Пишу все что интересно и на всем на чем интересно
вот этот код помог (найден здесь: stackoverflow.com/questions/4432385/django-how-to-...
class MyModel(models.Model):

    m2mfield = ManyToManyField(OtherModel)

    @staticmethod
    def met(sender, instance, action, reverse, model, pk_set, **kwargs):
        if action == 'pre_add':
            # here you can modify things, for instance
            pk_set.intersection_update([1,2,3]) 
            # only save relations to objects 1, 2 and 3, ignoring the others
        elif action == 'post_add':
            print pk_set
            # should contain at most 1, 2 and 3

m2m_changed.connect(receiver=MyModel.met, sender=MyModel.m2mfield.through)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы