Python Django:在post_save中添加多对多关系
我正在开发Django 2.0,我正在尝试创建一个具有自动选择加入功能的简单事件应用程序。也就是说,当创建Python Django:在post_save中添加多对多关系,python,django,Python,Django,我正在开发Django 2.0,我正在尝试创建一个具有自动选择加入功能的简单事件应用程序。也就是说,当创建事件时,具有特定状态的成员将自动注册事件 为此,我使用Django的post_save信号创建受影响成员的查询集,并将其添加到事件的多对多字段参与者中 @receiver(signal=post_save, sender='events.Event') def auto_opt_in(sender, instance, created, **kwargs): # Only appli
事件时,具有特定状态的成员将自动注册事件
为此,我使用Django的post_save
信号创建受影响成员的查询集,并将其添加到事件的多对多字段参与者中
@receiver(signal=post_save, sender='events.Event')
def auto_opt_in(sender, instance, created, **kwargs):
# Only applies to new Events that are opt-out
if created and instance.is_opt_out:
from database.models import Member
# Build queryset of affected members
members = Member.objects.none()
for status in instance.opt_out_member_statuses:
members = members.union(Member.objects.filter(member_status=status))
# Add members to Event
instance.participants.add(*members)
instance.save()
我现在的问题是成员
实际上并没有添加到事件
。如果我将print(instance.particients.all())
放在最后一行之后,它将输出正确的结果。但是,这些更改似乎没有提交到数据库。我错过了什么?是否不允许您对实例进行更改?如果是,那有什么意义
谢谢您需要这样做:
from django.db import transaction
transaction.on_commit(lambda: instance.cou_group.add(instance.participants.add(*members))
为什么??我不确定你不需要那个循环;您只需要Member.objects.filter(Member\u status\u in=instance.opt\u out\u Member\u status)
。此外,添加多对多后,您也不需要保存。@Daniel Roseman谢谢!这样更整洁(而且可能更快)。然而,原来的问题仍然存在。如果你不确定你应该尝试寻找更多关于这个主题的信息并编辑你的文章,这样对来这里的人会更有帮助。