gpt4 book ai didi

python - M2M 字段的 Django Rest 框架嵌套序列化器的更新方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:14 24 4
gpt4 key购买 nike

我的 models.py 中有三个模型,如下所示:

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

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)

用于创建新服务组的 JSON 负载如下:

    {
"name": "test_service_group1",
"services":["service_1", "service_2"],
}

由于我有一个 M2M through 表,因此我创建新服务组的策略是首先弹出服务列表,使用名称创建服务组,然后创建 M2M 关系。

用于创建新 ServiceGroup 的序列化程序如下:

class ServiceGroupCreateUpdateSerializer(serializers.ModelSerializer):
services = serializers.SlugRelatedField(queryset=Service.objects.all(),
slug_field='name', many=True)
class Meta:
model = ServiceGroup
fields = ['id', 'name', 'services']

def create(self, validated_data):
# Pop the services list out
services = validated_data.pop('services', None)
# Create the ServiceGroup with the name
service_group = ServiceGroup.objects.create(name=validated_data['name'])
#Create M2M associations
for service in services:
service_id = Service.objects.get(name=service)
ServiceToServiceGroup.objects.create(service_id=service_id,
service_group_id= service_group.id)

我的问题是现在如何编写更新方法?我的 JSON 负载保持不变,唯一的区别是我在 URL 中传递了实例 id。伪代码如下:

  1. 弹出服务列表。
  2. 将名称保存到实例 ID。
  3. 查找与 ServiceGroup 关联的现有服务。
  4. 对于现有列表和 JSON 负载列表中常见的服务,无需执行任何操作。
  5. 对于现有列表中但不在负载中的服务,请删除 M2M 关联。
  6. 对于不在现有列表和负载中的服务,请创建 M2M 关联。

对于更新方法来说,这似乎需要做很多工作。有更简单的方法吗?

更新

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

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

In [147]: new_services_list = ['test-create398']

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

In [149]: service_objects
Out[149]: <QuerySet [<Service: test-create398>]>

In [150]: instance.service_set = service_objects

In [151]: instance.save()

In [152]: instance.services.all()
Out[152]: <QuerySet [<Service: test-create442>]>

所以,我尝试了上面的方法,但没有成功。

最佳答案

您可以覆盖更新方法

def update(self, instance, validated_data):
# Pop the services list out
services = validated_data.pop('services', None)
instance = super().update(instance, validated_data)
service_objects = Service.objects.filter(name__in=services).all()
ServiceToServiceGroup.objects.filter(service_group=instance).delete()
service_group_obj = []
for service in service_objects:
service_group_obj(ServiceToServiceGroup(service=service, service_group=instance))
ServiceToServiceGroup.objects.bulk_create(service_group_obj)
return instance

关于python - M2M 字段的 Django Rest 框架嵌套序列化器的更新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53703734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com