Как добавить несколько строк данных в один столбец существующего экземпляра модели? Django
Здравствуйте, у меня есть представление, связанное с формой и моделью. Я хотел бы сделать так, чтобы когда я обновляю одно из этих полей (current-command). Оно добавляет эти данные в другое поле (Выполненные_команды). Затем, когда я позже добавлю другую команду в эту модель через форму, которая обновит поле Current_Commands. Это просто добавит еще одну строку в колонку Executed_commands. Вместо того, чтобы удалить данные, уже имеющиеся в этом столбце, и заменить их.
models.py (соответствующий раздел)
CHOICES = [
('Sleep', "Sleep"),
('Open SSH_Tunnel', 'Open SSH_Tunnel'),
('Close SSH_Tunnel', 'Close SSH_Tunnel'),
('Open TCP_Tunnel', 'Open TCP_Tunnel'),
('Close TCP_Tunnel', 'Close TCP_Tunnel'),
('Open Dynamic', 'Open Dynamic'),
('Close Dynamic', 'Close Dynamic'),
('Task', 'Task'),
]
class Command_Node(models.Model):
host_id = models.ForeignKey(Beacon, on_delete=models.CASCADE)
current_commands = models.CharField(choices=CHOICES, max_length=50, null=True),
Executed_Commands = models.CharField('Executed_Commands', max_length=2000, null=True)
def __str__(self):
return str(self.host_id)
forms.py (соответствующий раздел)
class Command_Form(ModelForm):
class Meta:
model = Command_Node
fields = (
'host_id',
'current_commands'
)
host_id = forms.ModelChoiceField(
required=True,
queryset=Beacon.objects.all(),
widget=forms.SelectMultiple(
attrs={
'class': 'form-control'
},
)
)
current_comamnds = forms.ChoiceField(
required=True,
choices=CHOICES
)
views.py (соответствующий раздел)
def update(request, host_id):
host_id = Command_Node.objects.get(pk=host_id)
form = Command_Form(request.POST or None, instance=host_id)
if form.is_valid():
form.save()
return redirect('home')
return render (request, 'update.html', {'host_id':host_id,'form':form})
Есть идеи, как мне это сделать? Поскольку я могу найти информацию о том, как обновить поле, но не о том, как просто добавить в столбец, а затем заменить строки столбцов этой модели на новые.
Спасибо
Вам просто нужно many2one на Executed_Commands
(теперь это модель
class Executed_Command(models.Model):
Command_node = models.ForeignKey(Command_Node, on_delete=models.DO_NOTHING)
command = models.CharField(choices=CHOICES, max_length=50, null=True)
class Command_Node(models.Model):
host_id = models.ForeignKey(Beacon, on_delete=models.CASCADE)
current_commands = models.CharField(choices=CHOICES, max_length=50, null=True),
def __str__(self):
return str(self.host_id)
Теперь вы можете иметь Command_Node
с большим количеством Executed_Command
Итак, необходимо добавить в Command_Form save
class Command_Form(ModelForm):
def save(self, **kwargs):
Executed_Command.objects.create(
command=self.cleaned_data["current_commands"],
Command_node=self.instance
)
return super().save(**kwargs)
Когда вы сохраняете форму, перед изменением current_commands
(опечатка в вашем коде, вставленном на StackOverFlow) мы создаем выполняемую команду, поэтому теперь, когда у вас есть Command_Form
, вы можете использовать :
command_form = Command_Form.objects.first()
command_form.Executed_command_set.all() # <- not sure with all _ and Maj here