Лучшая практика для связывания нескольких файлов с моделью, если количество файлов может варьироваться
У меня есть бухгалтерский модуль с такой моделью:
class Accounting_period(models.Model):
start_date = models.DateField()
end_date = models.DateField()
base_pdf = models.FileField()
У меня есть функция управления, которая запускается каждую ночь в полночь, и после фильтрации (end_date__lt=datetime.datetime.today()) она генерирует PDF-файл Invoice через pisa и сохраняет этот объект файла в base_pdf. PDF доступен по ссылке на сайте для бухгалтеров.
Однако после end_date возникают случаи, когда дополнительная работа должна быть возвращена в этот счет. Затем необходимо создать новый "Счет с обратным датированием", например "Счет-фактура-2.pdf", который имеет только новые итоги с обратным датом (поэтому мы не путаем учетщиков). Я хочу сохранить это в модели Accounting_period, чтобы я мог легко показывать ссылки на веб-странице. Тем не менее, я съеживаюсь от мысли добавить кучу FileFields в модель.
Мне интересно, есть ли у кого-нибудь хорошее решение этой проблемы. Я предполагаю что-то похожее на M2M, где для каждого отчетного периода в шаблоне я мог бы сделать это:
templates.py
<ul>
{% for invoice in accounting_period_obj.invoices.all %}
<li><a href="{{invoice.url}}">{{invoice.name}}</a>
{% endfor %}
</ul>
Аргумент сквозной передачи ManyToManyField выглядит многообещающе, но я не ссылаюсь на другую модель.
1 ответ
Вы можете использовать ForeignKey (отношение один ко многим) для этого:
class AccountingPeriodBackDated(models.Model):
accounting_period= models.ForeignKey(AccountingPeriod, related_name="backdates")
pdf = models.FileField()
Тогда используйте
templates.py
<ul>
<li><a href="{{accounting_period_obj.base_pdf.url}}">{{accounting_period_obj.base_pdf.name}}</a> (Original)</li>
{% for o in accounting_period_obj.backdates.all %}
<li><a href="{{o.pdf.url}}">{{o.pdf.name}}</a></li>
{% endfor %}
</ul>
Для получения дополнительной информации см.: https://docs.djangoproject.com/en/dev/ref/models/fields/.