我正在创建一个允许用户在线存储文件的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对象时需要数据。
答案 0 :(得分:1)
使用FileField,您可以将[function on upload_to] [1]
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to
答案 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)