type subir how files example archivo python django file

python - subir - Establecer FileField de Django en un archivo existente



models filefield example (5)

¡Tuve exactamente el mismo problema! entonces me doy cuenta de que mis Modelos estaban causando eso. ejemplo, tuve mis modelos así:

class Tile(models.Model): image = models.ImageField()

¡Entonces, quería tener más un mosaico haciendo referencia al mismo archivo en el disco! La forma en que encontré para resolver eso fue cambiar mi estructura de modelo a esto:

class Tile(models.Model): image = models.ForeignKey(TileImage) class TileImage(models.Model): image = models.ImageField()

Lo cual, después de darme cuenta, tiene más sentido, porque si quiero guardar el mismo archivo más de uno en mi base de datos, ¡tengo que crear otra tabla para él!

¡Supongo que también puedes resolver tu problema así, solo esperando que puedas cambiar los modelos!

EDITAR

También supongo que puede usar un almacenamiento diferente, como este por ejemplo: SymlinkOrCopyStorage

http://code.welldev.org/django-storages/src/11bef0c2a410/storages/backends/symlinkorcopy.py

Tengo un archivo existente en el disco (digamos /folder/file.txt) y un campo de modelo FileField en Django.

Cuando lo hago

instance.field = File(file(''/folder/file.txt'')) instance.save()

vuelve a file_1.txt el archivo como file_1.txt (la próxima vez que sea _2 , etc.).

Entiendo por qué, pero no quiero este comportamiento, sé que el archivo con el que quiero que esté asociado el campo realmente me está esperando, y solo quiero que Django lo señale.

¿Cómo?


Es correcto escribir una clase de almacenamiento propia. Sin embargo, get_available_name no es el método correcto para anular.

Se llama a get_available_name cuando Django ve un archivo con el mismo nombre e intenta obtener un nuevo nombre de archivo disponible. No es el método el que causa el cambio de nombre. el método causado es _save . Los comentarios en _save son bastante buenos y puede encontrar fácilmente que abre el archivo para escribir con el indicador os.O_EXCL que lanzará un OSError si ya existe el mismo nombre de archivo. Django get_available_name este error y luego llama a get_available_name para obtener un nuevo nombre.

Así que creo que la forma correcta es anular _save y llamar a os.open () sin marcar os.O_EXCL . La modificación es bastante simple, sin embargo, el método es un poco largo, así que no lo pego aquí. Dime si necesitas más ayuda :)


Si quieres hacer esto permanentemente, necesitas crear tu propia clase FileStorage

import os from django.conf import settings from django.core.files.storage import FileSystemStorage class MyFileStorage(FileSystemStorage): # This method is actually defined in Storage def get_available_name(self, name): if self.exists(name): os.remove(os.path.join(settings.MEDIA_ROOT, name)) return name # simply returns the name passed

Ahora en su modelo, usa su MyFileStorage modificado

from mystuff.customs import MyFileStorage mfs = MyFileStorage() class SomeModel(model.Model): my_file = model.FileField(storage=mfs)


prueba esto ( doc ):

instance.field.name = <PATH RELATIVE TO MEDIA_ROOT> instance.save()


simplemente establezca instance.field.name en la ruta de su archivo

p.ej

class Document(models.Model): file = FileField(upload_to=get_document_path) description = CharField(max_length=100) doc = Document() doc.file.name = ''path/to/file'' # must be relative to MEDIA_ROOT doc.file <FieldFile: path/to/file>