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)