(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 обновляется через admin. Я пробовал различные решения этой проблемы, но самый чистый подход представлял собой сигнал 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 членов при сохранении проекта (будь то сигнал или пользовательский метод сохранения), он всегда будет перезаписан членами, которые присутствовали в форме до сохранения. Спасибо, что указали это!