Python 如何获得外国钥匙的pk?
我希望允许以以下方式存储上传:Python 如何获得外国钥匙的pk?,python,django,Python,Django,我希望允许以以下方式存储上传: class Upload(models.Model): user = models.ForeignKey(User) category = models.ForeignKey(Category) file = models.FileField(upload_to='uploads/' + str(category.pk) + '/' + str(user.pk)) class Meta: unique_togeth
class Upload(models.Model):
user = models.ForeignKey(User)
category = models.ForeignKey(Category)
file = models.FileField(upload_to='uploads/' + str(category.pk) + '/' + str(user.pk))
class Meta:
unique_together = ('user', 'category')
这样,每次上传都会被沙盒存储在自己的目录中,首先是类别ID,然后是用户ID。我不必担心重复的文件名,目录结构也会整洁有序
但是,ForeignKey没有pk的实例,因此上面的代码实际上不起作用。有没有办法根据类别和用户将文件存储在目录中?或者,Django中是否有另一种常用的策略来组织文件上载?您可以使用可调用函数来:
这里有两件事需要解决 最简单的是,相关类别的pk在内存上载实例中作为self.Category_id可用,而相关用户的pk是self.User_id 更复杂的是,要使用动态上传,必须给它一个可调用的表达式,而不是任意的表达式。发件人: 这也可能是一个可调用的函数,比如一个函数,它将被调用以获取上传路径,包括文件名。此可调用函数必须能够接受两个参数,并返回一个Unix样式的路径,该路径带有前向斜杠,以便传递给存储系统。将要传递的两个参数是: 实例 定义文件字段的模型实例。更具体地说,这是附加当前文件的特定实例 在大多数情况下,此对象尚未保存到数据库中,因此如果它使用默认的自动字段,则其主键字段可能还没有值 文件名 最初指定给该文件的文件名。在确定最终目的地路径时,可以考虑也可以不考虑这一点 因此,您需要定义一个函数,该函数接受上载实例并返回所需的路径:
def upload_location(upload, original_filename):
return os.path.join(str(upload.category_id), str(upload.user_id), original_filename)
或者类似的。然后在模型中使用它:
file = models.FileField(upload_to=upload_location)
我正在考虑使用os.path.join。别以为我复制了你:@AamirAdnan-heh。这不是一个根深蒂固的秘密。我承认你的回答提醒了我需要严格定义整数FKs。
file = models.FileField(upload_to=upload_location)