Задать вопрос
@vhsporno

Как сохранить форму в несколько объектов?

Есть модель в которой хранятся ssh данные:
class Volumion(models.Model):
	name = models.CharField(max_length=50)
	hostname = models.CharField(max_length=50)
	port = models.IntegerField()
	user = models.CharField(max_length=30)
	password = models.CharField(max_length=30)
	is_online = models.BooleanField(default=False)


Есть модель в которой хранятся файлы которые есть на определенной ssh:
class Files(models.Model):
	volumio = models.ForeignKey(Volumion, on_delete = models.CASCADE)
	file = models.FileField(upload_to='uploads/')
	name = models.CharField(max_length=100, blank=True, null=True)


Цель: залить файл сразу на несколько ssh.
Как сделать чтобы при отправке формы сразу создавалось несколько объектов с с разными volumio_id?
То есть файл и название одинаковое, а volumio_id разный.
if form.is_valid():
			for vol in Volumion.objects.filter(is_online=True):
				new = form.save(commit=False)
				new.volumio_id = vol.id
				new.set_name()
				new.save()

Не работает, сохраняет только последний объект
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@vhsporno Автор вопроса
ids = [p.id for p in Volumion.objects.filter(is_online=True)]
			new = form.save(commit=False)
			new.volumio_id = ids[0]
			new.set_name()
			new.save()
			for id in ids[1:]:
				Files.objects.create(volumio_id=id, file=new.file, name=new.name)


Реализовал вот так
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@FulTupFul
Костыльное решение
В форме пишем метод дублирующий создание:
def save_duplicate(self, volumion):
    volumion.id = None
    volumion.save()
    Files.objects.create(**self.cleaned_data, volumio=volumion)

В вьюхе:
from copy import deepcopy

if form.is_valid():
      for vol in Volumion.objects.filter(is_online=True):
        new = form.save(commit=False)
        new.volumio_id = vol.id
        new.set_name()
        new.save()
        new.save_duplicate(deepcopy(vol))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы