Hier ist mein Modell. Ich möchte eine neue Datei generieren und die vorhandene überschreiben, wenn eine Modellinstanz gespeichert wird:
class Kitten(models.Model):
claw_size = ...
license_file = models.FileField(blank=True, upload_to='license')
def save(self, *args, **kwargs):
#Generate a new license file overwriting any previous version
#and update file path
self.license_file = ???
super(Request,self).save(*args, **kwargs)
Ich sehe viele Dokumentationen zum Hochladen einer Datei. Aber wie generiere ich eine Datei, ordne sie einem Modellfeld zu und lasse sie von Django am richtigen Ort speichern?
quelle
convert_to_pdf
. Danke dir!!f = open('/path/to/file', 'r')
für ZIP Art von Datei,f = open('/path/to/file.zip', 'rb')
MEDIA_ROOT
wurde im Sellerie-Worker nicht mit demselben Volume geteilt. Durch das Teilen des benannten Volumes wurde das Problem behoben ( Ref ).Akzeptierte Antworten sind sicherlich eine gute Lösung, aber hier ist die Art und Weise, wie ich eine CSV generiert und aus einer Sicht bereitgestellt habe.
Ich dachte, es hat sich gelohnt, dies hier zu platzieren, da ich ein wenig herumgespielt habe, um das gewünschte Verhalten zu erreichen (vorhandene Datei überschreiben, an der richtigen Stelle speichern, keine doppelten Dateien erstellen usw.).
Django 1.4.1
Python 2.7.3
quelle
Es
close()
wird empfohlen, beim Speichern von Dateien einen Kontextmanager zu verwenden oder bei Ausnahmen aufzurufen . Kann passieren, wenn Ihr Speicher-Backend nicht verfügbar ist usw.Jedes Überschreibungsverhalten sollte in Ihrem Speicher-Backend konfiguriert werden. Zum Beispiel hat S3Boto3Storage eine Einstellung
AWS_S3_FILE_OVERWRITE
. Wenn Sie verwendenFileSystemStorage
, können Sie ein benutzerdefiniertes Mixin schreiben .Möglicherweise möchten Sie auch die Speichermethode des Modells anstelle der Speichermethode von FileField aufrufen, wenn benutzerdefinierte Nebenwirkungen wie zuletzt aktualisierte Zeitstempel auftreten sollen. In diesem Fall können Sie auch das Namensattribut der Datei auf den Namen der Datei setzen - relativ zu
MEDIA_ROOT
. Standardmäßig wird der vollständige Pfad der Datei verwendet, was zu Problemen führen kann, wenn Sie ihn nicht festlegen - siehe Datei .__ init __ () und Dateiname .Hier ist ein Beispiel, in dem
self
sich die Modellinstanzmy_file
befindet, in der sich FileField / ImageFile befindet undsave()
die gesamte Modellinstanz anstelle von nur FileField aufruft:quelle