Django FileField con upload_to determinado en tiempo de ejecución

Estoy intentando configurar mis subidas para que si el usuario joe carga un archivo, vaya a MEDIA_ROOT / joe en lugar de que todos los archivos vayan a MEDIA_ROOT. El problema es que no sé cómo definir esto en el modelo. Aquí está cómo se ve actualmente:

class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file = models.FileField(upload_to='.') 

Así que lo que quiero es en lugar de ‘.’ como upload_to, haz que sea el nombre del usuario.

Entiendo que a partir de Django 1.0, puedes definir tu propia función para manejar el upload_to, pero esa función no tiene idea de quién será el usuario, así que estoy un poco perdido.

¡Gracias por la ayuda!

Probablemente hayas leído la documentación , así que aquí tienes un ejemplo fácil para que tenga sentido:

 def content_file_name(instance, filename): return '/'.join(['content', instance.user.username, filename]) class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file = models.FileField(upload_to=content_file_name) 

Como puede ver, ni siquiera necesita usar el nombre de archivo dado, puede anularlo en su upload_ to invocable también si lo desea.

Esto realmente ayudó. Por un poco más de brevedad, decidí usar lambda en mi caso:

 file = models.FileField( upload_to=lambda instance, filename: '/'.join(['mymodel', str(instance.pk), filename]), ) 

Una nota sobre el uso del valor pk del objeto ‘instancia’. Según la documentación:

En la mayoría de los casos, este objeto aún no se habrá guardado en la base de datos, por lo que si usa el campo automático predeterminado, es posible que aún no tenga un valor para su campo de clave principal.

Por lo tanto, la validez de usar pk depende de cómo se define su modelo en particular.