(Django 1.1) У меня есть модель Project, которая отслеживает своих членов, используя поле m2m.Это выглядит так:
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
добавляются к участникам, чтобы упростить отслеживаниеразрешений проекта.Этот подход до сих пор работал очень хорошо.
Проблема, с которой я сейчас имею дело, заключается в том, как обновить членство в проекте, когда одно из полей User
FK обновляется через администратора.Я пробовал различные решения этой проблемы, но самым чистым подходом был сигнал 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, чтобы обновить членство?Заранее благодарим за помощь!
ОБНОВЛЕНИЕ:
Просто чтобы уточнить, сигнал post_save работает правильно, когда я сохраняю свою форму в интерфейсе (старые участникиудалены и добавлены новые).Однако сигнал post_save НЕ работает правильно, когда я сохраняю проект через администратора (участники остаются прежними).
Я думаю, диагноз Питера Роуэлла в этой ситуации верный.Если я удаляю поле "members" из формы администратора, сигнал post_save работает правильно.Когда поле включено, оно сохраняет старые элементы на основе значений, представленных в форме во время сохранения.Независимо от того, какие изменения я внесу в поле membersmm m2m при сохранении проекта (будь то сигнал или пользовательский метод сохранения), оно всегда будет перезаписываться элементами, присутствовавшими в форме до сохранения.Спасибо за указание на это!