在Django中:如何在从django-admin调用save()时自动填充ManyToMany字段?
这是我的 Conversation
模型:
class Conversation(models.Model):
creator = models.ForeignKey(User, related_name='created_by')
participants = models.ManyToManyField(User, blank=True, null=True)
我想在创建对话后,自动添加一个随机用户到 participants
属性中。
为此,我首先尝试了信号捕捉,使用了 post_save
信号。但是,participants
并没有正确保存,并且我还遇到了一个问题,就是必须在信号捕捉的方法内部禁用信号,以避免无限递归,这一切都让我觉得很不对劲。
在我的第二次尝试中,我重写了 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)
现在根据我使用的方式不同,行为有了两个明显的区别:
- 当我在控制台创建一个新的 Conversation 对象,设置它的
creator
并调用save()
时,一切都按预期工作。 - 但是当我在管理后台创建一个新的 Conversation,设置它的
creator
并点击“保存”按钮后,保存后参与者列表仍然是空的。
我第一反应是,管理后台可能以某种方式覆盖了这个行为。这可能是对的吗?
1 个回答
2
你的误解在于认为在添加参与者后需要再次保存对话。其实不需要:多对多的字段并不是真正的模型字段,而是一个在单独的连接表中的实体。只要调用 add
方法,就足够保存新的参与者了。