Создание поля в модели, допускающего несколько записей, которое сохраняется в БД инкрементально
У меня есть модель под названием Handoff, пользователи создают новую передачу каждый день и добавляют к ней заметки для передачи следующей смене.
Мне нужно поле, которое может фиксировать ввод пользователя и сохранять данные в БД, но это поле должно быть способно записывать данные в БД итеративно. Для контекста, пользователь будет добавлять новую заметку каждый раз, когда ему есть что добавить к передаче, и это должно записываться в БД индивидуально (например, если поле называется new_note, данные должны записываться в БД, и каждая новая заметка будет сохраняться как new_note_1).
Затем эти записи будут сведены в таблицу для представления следующей смене при передаче дел.
Какие методы лучше всего подходят для этого?
Очевидный ответ - модель HandoffEntry с TextField и внешним ключом к связанным Handoff
class HandoffEntry (models.Model):
handoff = models.ForeignKey( Handoff, models.CASCADE, related_name='entries', ...)
text = models.TextField( ...)
# and maybe a date-time-field with auto-update=True might be useful?
Для отображения
handoff = Handoff.objects.get( ...)
entries = handoff.entries.all().order_by('-pk') # most recent first, pk is unconditionally greater for newer
В шаблоне можно выполнять итерации
{% for entry in entries %}
{{ entry.text }}
{% endfor %}
для ввода данных, просто ModelForm с одним полем text.
Вы также можете автоматически записать, кто выполняет передачу, в другое поле, взяв данные из request.user, или использовать другое ForeignKey для User
Думаю, вам нужно начать изучать отношения моделей. Документация Django
Вы захотите попробовать создать модель, как показано ниже :
from django.db import models
class Note(models.Model):
content = models.CharField(max_length=30)
def __str__(self)
return 'new_note_{}'.format(self.id)
class Handoff(models.Model):
note = models.ForeignKey(Note, on_delete=models.CASCADE)
Вы можете создать логику, чтобы сначала создать и сохранить заметку, а затем прикрепить созданную модель к модели передачи, как показано ниже.
# something...
new_note = Note(
content="Some Text"
)
new_note.save()
new_handoff = Handoff(
note=new_note
)
new_handoff.save()
Вот и все, ваша модель теперь реализована, и каждая новая передача имеет свои уникальные отношения один-к-одному с вашей моделью передачи.