首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django中更新模型实例的M2M关系

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

Stack Overflow用户
提问于 2018-12-11 16:55:26
回答 1查看 168关注 0票数 0

我有3个模型,如下所示:

代码语言:javascript
复制
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关联。我尝试了以下几种方法:

代码语言:javascript
复制
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>]>

然而,很明显,这并不起作用。这样做的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-12-11 17:01:29

为了创建连接,您需要创建一个中介实例:

代码语言:javascript
复制
for service in service_objects:
    ServiceToServiceGroup.objects.create(
        service=service,
        service_group=instance,
    )

您还可以使用批量创建:

代码语言:javascript
复制
ServiceToServiceGroup.objects.bulk_create(
        [ServiceToServiceGroup(
            service=service, 
            service_group=instance
         ) for service in service_objects]
    )

要删除旧关系,您可以运行:

代码语言:javascript
复制
ServiceToServiceGroup.objects.filter(service_group=instance).delete()

代码语言:javascript
复制
instance.servicetoservicegroup_set.all().delete()

在运行添加脚本之前。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53720506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档