Django - 将对象存储在Foreign Key中

时间:2012-08-21 00:37:52

标签: python django model foreign-keys foreign-key-relationship

  

可能重复:
  Django FileField with upload_to determined at runtime

我正在创建一个允许用户在线存储文件的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 / myfile”路径下。

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

现在关于Django的数据库API无法正常工作,因为在我可以使用API​​之前必须将对象保存到数据库中。事实并非如此,因为我在构建Item对象时需要数据。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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)