Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:在post_save中添加多对多关系_Python_Django - Fatal编程技术网

Python Django:在post_save中添加多对多关系

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 2.0,我正在尝试创建一个具有自动选择加入功能的简单事件应用程序。也就是说,当创建
事件时,具有特定状态的
成员将自动注册
事件

为此,我使用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谢谢!这样更整洁(而且可能更快)。然而,原来的问题仍然存在。如果你不确定你应该尝试寻找更多关于这个主题的信息并编辑你的文章,这样对来这里的人会更有帮助。