Django - Как сохранить данные m2m с помощью сигнала post_save?

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

12
задан vishes_shell 2 March 2016 в 21:41
поделиться