У меня есть три модели в моем 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"],
}
Поскольку у меня естьМ2М через таблицу. Моя стратегия создания новой группы ServiceGroup заключается в том, чтобы сначала открыть список служб, создать группу ServiceGroup с именем, а затем создать 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-адресе. Псевдокод выглядит следующим образом:
- Вывести список служб.
- Сохранить имя в идентификаторе экземпляра.
- Найдите существующие службы, связанные с ServiceGroup.
- Для служб, общих в существующем списке и списке полезной нагрузки JSON, ничего не делайте.
- Для служб в существующем списке ине в полезной нагрузке, удалите ассоциации M2M.
- Для служб, которых нет в существующем списке и в полезной нагрузке, создайте ассоциации 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>]>
Итак, я попробовал выше, и это не сработало.