Ich habe eine vorhandene Datei auf der Festplatte (z. B. /folder/file.txt) und ein FileField-Modellfeld in Django.
Wenn ich es tue
instance.field = File(file('/folder/file.txt'))
instance.save()
Die Datei wird erneut gespeichert als file_1.txt
(beim nächsten Mal _2
usw.).
Ich verstehe warum, aber ich möchte dieses Verhalten nicht - ich weiß, dass die Datei, mit der das Feld verknüpft werden soll, wirklich auf mich wartet, und ich möchte nur, dass Django darauf verweist.
Wie?
FileField
. Immer wenn aFileField
gespeichert wird, wird eine neue Kopie der Datei erstellt. Es wäre ziemlich einfach, eine Option hinzuzufügen, um dies zu vermeiden.Antworten:
Wenn Sie dies dauerhaft tun möchten, müssen Sie Ihre eigene FileStorage-Klasse erstellen
Jetzt verwenden Sie in Ihrem Modell Ihren modifizierten MyFileStorage
quelle
FilePathField
oder einfach als einfachen Text speichern .Stellen Sie einfach
instance.field.name
den Pfad Ihrer Datei einz.B
quelle
MEDIA_ROOT
, das heißt.doc.file = 'path/to/file'
versuchen Sie dies ( doc ):
quelle
Es ist richtig, eine eigene Speicherklasse zu schreiben. Dies
get_available_name
ist jedoch nicht die richtige Methode zum Überschreiben.get_available_name
wird aufgerufen, wenn Django eine Datei mit demselben Namen sieht und versucht, einen neuen verfügbaren Dateinamen abzurufen. Es ist nicht die Methode, die das Umbenennen verursacht. die Methode verursacht das ist_save
. Kommentare in_save
ist ziemlich gut und Sie können leicht feststellen, dass es eine Datei zum Schreiben mit Flag öffnetos.O_EXCL
, die einen OSError auslöst, wenn derselbe Dateiname bereits vorhanden ist. Django fängt diesen Fehler ab und ruftget_available_name
an, um einen neuen Namen zu erhalten.Ich denke, der richtige Weg ist,
_save
os.open () ohne Flag zu überschreiben und aufzurufenos.O_EXCL
. Die Änderung ist recht einfach, aber die Methode ist etwas lang, so dass ich sie hier nicht einfüge. Sag mir, wenn du mehr Hilfe brauchst :)quelle
get_available_name
besteht darin, dass der Server beim Hochladen einer Datei mit demselben Namen in eine Endlosschleife gerät. Da_save
der Dateiname überprüft und beschlossen wird, einen neuen zu erhalten, wirdget_available_name
der doppelte weiterhin zurückgegeben. Sie müssen also beide überschreiben.Ich hatte genau das gleiche Problem! dann merke ich, dass meine Models das verursacht haben. Beispiel Ich hatte meine Modelle so:
Dann wollte ich mehr die eine Kachel haben, die auf dieselbe Datei auf der Festplatte verweist! Die Art und Weise, wie ich das gelöst habe, war, meine Modellstruktur folgendermaßen zu ändern:
Was, nachdem ich erkannt habe, dass dies sinnvoller ist, denn wenn ich möchte, dass dieselbe Datei mehr als eine in meiner Datenbank gespeichert wird, muss ich eine andere Tabelle dafür erstellen!
Ich denke, Sie können Ihr Problem auch so lösen, in der Hoffnung, dass Sie die Modelle ändern können!
BEARBEITEN
Ich denke auch, dass Sie einen anderen Speicher verwenden können, wie zum Beispiel: SymlinkOrCopyStorage
http://code.welldev.org/django-storages/src/11bef0c2a410/storages/backends/symlinkorcopy.py
quelle