Django-文件字段上载到,文件名来自其他字段';s主键

Django-文件字段上载到,文件名来自其他字段';s主键,django,django-models,Django,Django Models,我有一个Django模型: class ObservationMedia(models.Model): observation = models.ForeignKey(Observation) audio_file = AudioFileField ( upload_to=audio_dir, blank=True, null=True ) photo_file = models.ImageField( upload_to=img_dir, blank=Tru

我有一个Django模型:

class ObservationMedia(models.Model):
    observation = models.ForeignKey(Observation)  
    audio_file = AudioFileField   ( upload_to=audio_dir, blank=True, null=True )
    photo_file = models.ImageField( upload_to=img_dir,   blank=True, null=True )
此介质表链接到介质相关的表(观察)


如何保存
AudioFileField
(只是
FileField
的一个超类)和
ImageField
,使文件名成为观察的主键,例如
2465.jpg
?据我所知,我只允许将'instance'和'filename'传递到
upload\u
,因此我不知道如何传递这个额外的参数。

您可以从实例获取pk。像这样:

def get_audio_path(instance, filename):
   return os.path.join(audio_dir+instance.observation.pk+".jpg")

class ObservationMedia(models.Model):
   observation = models.ForeignKey(Observation)  
   audio_file = AudioFileField   ( upload_to=get_audio_path, blank=True, null=True )

我不希望根据
pk
存储文件,这将导致安全问题,因为任何人都可以通过增加
pk
来浏览文件。使用一些安全的散列,这很难猜测。好的,这是一个很好的建议。现在我正在用时间戳保存它们,所以这可能比pk好。哦,我明白了,我没有意识到
instance
就是模型的实例。但是,文档说:“在大多数情况下,这个对象还没有保存到数据库中,因此如果它使用默认的自动字段,它的主键字段可能还没有值。”()。所以这可能不安全。是的,对。如果尚未创建观测模型,则该操作将不起作用。对于我的项目,我只使用随机生成的名称。