Моя модель Content
имеет отношение many-to-many
к модели Tag
. Когда я сохраняю объект Content
, я хочу динамически добавлять отношения. Я делаю это следующим образом.
def tag_content(obj):
for tag in Tag.objects.all():
print tag
obj.tags.add(tag)
obj.is_tagged = True
obj.save()
class Tag(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
title = models.CharField(max_length=255)
is_tagged = models.BooleanField(default=False)
tags = models.ManyToManyField(Tag, blank=True)
def save(self, *args, **kwargs):
super(Content, self).save(*args, **kwargs)
@receiver(post_save, sender = Content)
def update_m2m_relationships_on_save(sender, **kwargs):
if not kwargs['instance'].is_tagged:
tag_content(kwargs['instance'])
Функция tag_content
выполняется, однако связи m2m
не устанавливаются. Я использую Django 1.9.8, кстати. Это не имеет никакого смысла. Что мне не хватает? Более того, если я делаю что-то вроде tag_content(content_instance)
в оболочке, то теги устанавливаются, так что функция в порядке. Думаю проблема в ресивере. Любая помощь?
Изменить
Мой вопрос не имеет ничего общего с m2m_changed, как я уже сказал, создание объекта Content в оболочке работает отлично. Следовательно, проблема кроется в настройке админки.
update_m2m_relationships_on_save
вызывается и что он получает правильные kwargs? Вот как я бы отладил это лично. Потому что вы, кажется, проверили все остальные части... - person shark3y   schedule 23.08.2016print tag
делает именно это, и да, метод сохранения вызывает метод update_m2m. - person darkhorse   schedule 23.08.2016kwargs['instance']
иkwargs['instance'].is_tagged
перед операторомif
в вашем приемнике, чтобы убедиться, что объект и логическое значение соответствуют вашим ожиданиям. - person souldeux   schedule 23.08.2016obj
является правильным, и он не зацикливается навсегда. Это спасает. Возможно ли, что вы проверяете устаревшие данные (например, из оболочки). У меня это случилось несколько дней назад ... Просто повторно получите предмет после того, как это будет выполнено, чтобы перепроверить. (стоит попробовать!) - person shark3y   schedule 23.08.2016