(Django 1.1) У меня есть модель проекта, которая отслеживает ее членов, используя поле m2m. Это выглядит следующим образом:Django - Как сохранить данные m2m через сигнал post_save?
class Project(models.Model):
members = models.ManyToManyField(User)
sales_rep = models.ForeignKey(User)
sales_mgr = models.ForeignKey(User)
project_mgr = models.ForeignKey(User)
... (more FK user fields) ...
Когда проект создан, выбранный sales_rep
, sales_mgr
, project_mgr
и т.д. User
s добавлены к членам, чтобы сделать его легче отслеживать разрешения проекта. До сих пор этот подход работал очень хорошо.
Проблема, с которой я имею дело сейчас, заключается в том, как обновить членство в проекте, когда один из полей FK User
обновлен через администратора. Я пробовал различные решения этой проблемы, но чистый подход казался post_save
сигнал, как следующее:
def update_members(instance, created, **kwargs):
"""
Signal to update project members
"""
if not created: #Created projects are handled differently
instance.members.clear()
members_list = []
if instance.sales_rep:
members_list.append(instance.sales_rep)
if instance.sales_mgr:
members_list.append(instance.sales_mgr)
if instance.project_mgr:
members_list.append(instance.project_mgr)
for m in members_list:
instance.members.add(m)
signals.post_save.connect(update_members, sender=Project)
Однако Project
все еще имеет те же элементы, даже если я изменить один из полей с помощью админ! Я успешно обновлял поля m2m, используя свои собственные представления в других проектах, но мне никогда не приходилось так хорошо играть с администратором.
Есть ли другой подход, который я должен использовать вместо сообщения post_save для обновления членства? Заранее спасибо за вашу помощь!
UPDATE:
Просто чтобы прояснить, сигнал post_save работает правильно, когда я сохраняю свою собственную форму в передней части (старые члены удаляются, и добавлены новые). Однако сигнал post_save НЕ работает правильно, когда я сохраняю проект через администратора (члены остаются неизменными).
Я думаю, что диагноз Питера Роуэлла правилен в этой ситуации. Если я удаляю поле «члены» из формы администратора, сигнал post_save работает правильно. Когда поле включено, оно сохраняет старые элементы на основе значений, присутствующих в форме во время сохранения. Независимо от того, какие изменения я внес в поле m2m членов при сохранении проекта (будь то сигнал или пользовательский метод сохранения), он всегда будет перезаписан членами, которые присутствовали в форме до сохранения. Спасибо что подметил это!
Я не знаю, если это ваша проблема, но у меня есть шестое чувство, что вы можете быть запущены в артефакт, как код формы обновляет информацию m2m. В основном они сначала сохраняют основной объект, затем устанавливают значения m2m, сначала очищая их все, а затем устанавливая их на основе имеющихся значений * в форме *. Это происходит * после * сохранения() на основном объекте, поэтому все, что вы делаете в save() или на основе сигнала 'post_save', сначала выполняется, а затем * отменяется *. Это находится в 'django.forms.models.save_instance()'. Было бы неплохо, если бы был сигнал 'after_form_save'. –
Спасибо, Питер! Я считаю, что ваш диагноз правильный. Я обновил свой оригинальный пост, чтобы включить эту информацию. –
Питер прав. У меня была та же проблема, и я нашел обходное решение, но это не так, как сигнал «after_form_save»: http://stackoverflow.com/questions/3652585/simple-django-form-model-save-question –