Django FileField.save () делает дубликаты файлов - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть пользовательское содержимое, которое я пытаюсь записать в файл, а затем сохранить в FileField.

, поэтому у меня есть модель , которая выглядит следующим образом:

class Revision(models.Model):
    def custom_revision_file_path(instance, filename):
        return '/'.join(['content/revisions', filename])
    path = models.FileField(upload_to=custom_revision_file_path)
    document = models.ForeignKey(Document)
    ...

, а представление , которое создает экземпляр, выглядит следующим образом:

def handle_revisions(request): 
    document = Document.objects.get(id=request.GET['docid'])
    basename = os.path.basename(str(document.path))

    revision = Revision.objects.create(
        document = document,
    )
    revision.path.save(basename, ContentFile(request.GET['revision']))

Все это работает относительно хорошо, но для двух проблем:

1) ContentFile ставит пробел между каждой буквой в моей строке, поэтому 'test' превращается в 't e s t';

2) по какой-то причине каждый раз, когда я запускаю представление, два экземпляра Revision сохраняются с примерно одинаковым путем.то есть.один путь будет 'content/revisions/test.txt', а другой будет 'content/revisions/test_1.txt', когда второй вообще не будет существовать.

Что дает?

1 Ответ

2 голосов
/ 28 декабря 2011

Прежде всего, вы никогда не должны использовать что-то подобное для создания пути:

'/'.join(['content/revisions', filename])

, но:

os.path.join("my_dir", "my_subdir", ..., "filename.txt")

Вы не должны знать, работает ли ваше приложение Unix-подобный или Windows (да, некоторые люди используют Windows в качестве веб-сервера).

Кроме того, вам не следует называть свой атрибут FileField path,это неоднозначно с FilePathField.

Это поле NOT NULL?Потому что в своем заявлении create() вы его не предоставляете.Это должно вызвать ошибку.

Я не понимаю:

revision.path.save(basename, ContentFile(request.GET['revision']))

Чего вы пытаетесь достичь?Вы уверены, что хотите сохранить в файле параметр GET ?

Чтобы ответить на ваш вопрос, по умолчанию Django не берет на себя ответственность перезаписывать файл, который существует в вашей файловой системе,Вот почему он автоматически сохраняет его с уникальным путем 1030 *, добавляя суффикс.

Если это поведение не подходит, рассмотрите возможность записи пользовательского хранилища файлов .

...