Как хранить файлы в поле массива djangos

Я играю с django.contrib.postgres.fields.ArrayField в django 1.8 alpha и пытаюсь использовать его с полем файла.

Вот сообщение в вымышленном форуме:

# coding=utf-8
from backend.core.models import Team
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.db.models import FileField


class Post(models.Model):

    title = models.CharField(max_length=256)
    content = models.TextField()

    team = models.ForeignKey(Team, related_name='posts')

    attachments = ArrayField(FileField(), null=True)

    def __str__(self):
        return self.title

Сработала миграция, и все выглядит великолепно.

Однако: Django Admin не поддерживает это поле.

Как я могу реализовать это в коде, как я могу сохранить/добавить новый файл в это поле массива и сохранить его ссылку в базе данных?

Ответ 1

В настоящее время я думаю, что django.contrib.postgres.fields.ArrayField находится в активной разработке. Пакет django.contrib новый для django 1.8 (который все еще находится в бета-версии), поэтому я считаю, что эта функциональность слишком рано рассчитывать.

Текстовое поле, которое вы видите, предназначено для строки с разделителями, которая сохраняется в массиве. Это имеет смысл с массивом FileFields, потому что FileField сохраняет строку URL, а не blob файла (насколько я могу судить).

A \d table дает информацию таблицы в этом столбце следующим образом:

arrayexample=# \d example_post
Column      | Type                     | Modifiers
--------------------------------------------------
attachments | character varying(100)[] |

В настоящее время поле, которое вы видите в админ, создается из здесь. Обратите внимание, что он наследует от forms.CharField, а FileField использует forms.ClearableFileInput.

Я не думаю, что функциональность, которую вы ищете, в настоящее время существует в Django, но я думаю, что ее можно построить. Лично я хотел бы построить его путем подклассификации существующего ArrayField и переопределения formfield для использования моего пользовательского form_class, чтобы лучше обрабатывать Array of FileField s.

Надеюсь, это поможет, я также не вижу открытых запросов на получение этой функции.

Ответ 2

Вы должны использовать FileField.storage, который обрабатывает хранение и извлечение файлов. Для получения дополнительной информации см. Документацию Django на Управление файлами