Создание поля в модели, допускающего несколько записей, которое сохраняется в БД инкрементально

У меня есть модель под названием 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()

Вот и все, ваша модель теперь реализована, и каждая новая передача имеет свои уникальные отношения один-к-одному с вашей моделью передачи.

Вернуться на верх