【问题标题】:In Django: How do I auto-fill a ManyToMany-Field on save(), when called from django-admin?在 Django 中:当从 django-admin 调用时,如何在 save() 上自动填充 ManyToMany-Field?
【发布时间】:2014-05-16 23:00:58
【问题描述】:

这是我的Conversationmodel:

class Conversation(models.Model):
    creator = models.ForeignKey(User, related_name='created_by')
    participants = models.ManyToManyField(User, blank=True, null=True)

我想在创建对话后自动将随机用户添加到participants 属性中。

为此,我首先尝试使用post_save 信号进行信号捕获。但是participants无法正确保存,我也遇到了必须在信号捕获方法within中禁用信号,避免无限递归的问题,感觉很错了。

在我的第二次尝试中,我覆盖了save()方法:

def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
    # first, save normally, so the object exists
    super(Conversation, self).save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)

    # then add some conversationalists
    if self.participants.count() < 2:
        new_participant = User.objects.order_by('?')[:1].get()
        self.participants.add(self.creator)
        self.participants.add(new_participant)

现在有两种不同的行为,取决于我使用的是 Django-Admin 还是控制台:

  1. 当我创建一个新的 Conversation 对象,设置它的 creator 并在控制台中调用 save() 时,一切正常。
  2. 当我在管理员中创建一个新对话时,设置它的creator 并点击“保存”按钮,保存后参与者列表仍然是空的。

我的第一直觉是管理员以某种方式覆盖了这种行为。这可能是正确的吗?

【问题讨论】:

    标签: python django model save


    【解决方案1】:

    您的错误在于认为您需要在添加参与者后再次保存对话。你不知道:多对多字段并不是模型上的真正字段,它是单独链接表中的实体。只需拨打add 即可保存新参与者。

    【讨论】:

    • 你是对的。当我删除对 save() 的第二次调用时,它的工作方式相同。但是,关系仍未保存。
    • 经过进一步测试,事实证明它已保存,但在我使用 Django-Admin 时没有。 -- 更新我的问题。
    • 将您的答案标记为正确,因为它回答了我最初的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2011-06-19
    • 2022-11-04
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多