Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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中更新模型实例的M2M关系_Python_Django - Fatal编程技术网

Python 在Django中更新模型实例的M2M关系

Python 在Django中更新模型实例的M2M关系,python,django,Python,Django,我有以下三种型号: class Service(models.Model): name = models.CharField(max_length=50, unique=True) class ServiceGroup(models.Model): name = models.CharField(max_length=50, unique=True) services = models.ManyToManyField(Service, through=ServiceTo

我有以下三种型号:

class Service(models.Model):
    name = models.CharField(max_length=50, unique=True)

class ServiceGroup(models.Model):
    name = models.CharField(max_length=50, unique=True)
    services = models.ManyToManyField(Service, through=ServiceToServiceGroup)

class ServiceToServiceGroup(models.Model):
    service = models.ForeignKey(Service)
    service_group = models.ForeignKey(ServiceGroup)
我有一个服务列表,我需要为ServiceGroup的一个实例建立M2M关联。我尝试了以下方法:

In [145]: instance = ServiceGroup.objects.get(pk=1)                                                                                                                                                                                                                      

In [146]: instance.services.all()                                                                                                                                                                                                                                        
Out[146]: <QuerySet [<Service: service-1>]>

In [147]: new = ['service-2']                                                                                                                                                                                                                         

In [148]: service_objects = Service.objects.filter(name__in=new)                                                                                                                                                                                    

In [149]: service_objects                                                                                                                                                                                                                                                
Out[149]: <QuerySet [<Service: service-2>]>

In [150]: instance.service_set = service_objects                                                                                                                                                                                                                         

In [151]: instance.save()                                                                                                                                                                                                                                                

In [152]: instance.services.all()                                                                                                                                                                                                                                        
Out[152]: <QuerySet [<Service: service-1>]>
[145]中的
:instance=ServiceGroup.objects.get(pk=1)
在[146]中:instance.services.all()
出[146]:
在[147]中:new=['service-2']
In[148]:service\u objects=service.objects.filter(name\u In=new)
In[149]:服务对象
出[149]:
在[150]中:instance.service\u set=service\u对象
在[151]:instance.save()中
在[152]中:instance.services.all()
出[152]:

然而,很明显,这是行不通的。正确的方法是什么?

要创建连接,需要创建中介实例:

for service in service_objects:
    ServiceToServiceGroup.objects.create(
        service=service,
        service_group=instance,
    )
您还可以使用批量创建:

ServiceToServiceGroup.objects.bulk_create(
        [ServiceToServiceGroup(
            service=service, 
            service_group=instance
         ) for service in service_objects]
    )
要删除旧关系,您可以运行:

ServiceToServiceGroup.objects.filter(service_group=instance).delete()


在运行添加脚本之前。

是否要创建一个新对象并将其保存在ServiceToServiceGroup中?是。即使需要这样做。还需要删除旧关联。但是,这不会删除旧的关联。我需要一个更新函数,在其中添加新的服务并删除旧的服务。对于您的情况,我认为您需要执行
ServiceToServiceGroup.objects.filter(service\u group=instance)。delete()
在运行上面的添加新关联脚本之前。是的..看起来这是唯一的选项:-(你也可以做得更简单,因为
instance.servicetoservicegroup\u set.all().delete()
如果我的答案有帮助,你能将其标记为解决方案吗?祝你好运!
instance.servicetoservicegroup_set.all().delete()