1

可能重复:
在运行时确定的带有 upload_to 的 Django FileField

我正在创建一个允许用户在线存储文件的 Web 应用程序,例如 Dropbox。用户的文件由模型 Item 建模:

from django.db import models
from django.contrib.auth.models import User


class Item(models.Model):
    # Name of file
    name = models.CharField(max_length=200)

    # Site user who owns the file
    user = models.ForeignKey(User)

    # Path to file in database
    # Python complains here since "username" is an attribute of the User class, not
    # an attribute of ForeignKey.
    file = models.FileField(upload_to=(user.username + '/' + name))

现在,如果您查看 FileField 的 upload_to 参数,我想指定文件在我的数据库中的存储位置。如果我有一个带有文件“myfile”的用户“bill”,他的文件应该在路径“bill/myfile”下。

为了得到这个字符串,我尝试了“user.username + '/' + name”,但是python抱怨用户没有属性用户名,因为用户不是用户对象:它是一个存储用户的外键。所以问题是,如何在代码中从 ForeignKey 获取用户对象?

现在关于 Django 的数据库 API 不起作用,因为在我可以使用 API 之前必须将对象保存到数据库中。情况并非如此,因为我在构建 Item 对象期间需要数据。

4

2 回答 2

1

使用 FileField 您可以将 [function on upload_to][1]

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to

于 2012-08-21T00:56:31.700 回答
1

无论哪种方式,您的方法都有缺陷,因为您传入的任何内容upload_to都将被调用一次。即使user.username有效,您也必须记住它仅在定义类时计算。

您需要定义一个自定义upload_to函数以传递给该字段。

def custom_upload_to(instance, filename):
     return '{instance.user.username}/'.format(instance=instance)

myfield = models.FileField(upload_to=custom_upload_to)
于 2012-08-21T04:09:41.933 回答