将django ForeignKey转换为可用的目录名

时间:2009-08-17 20:22:36

标签: python django django-models

我正在开发一个django应用程序,用户可以上传各种文档。我的models.py的相关部分是:

class Materials(models.Model):
    id = models.AutoField(primary_key=True)
    id_presentations = models.ForeignKey(Presentations, db_column='id_Presentations', related_name = "materials_id_presentations") # Field name made lowercase.
    materialpathname = 'documents/'
    materialpathname += str(id_presentations)
    document = models.FileField(db_column='Document', upload_to = materialpathname) # Field name made lowercase.
    docname = models.CharField(max_length=40, db_column='DocName') # Field name made lowercase.
    class Meta:
        db_table = u'Materials'

我的目的是将与给定演示文稿关联的文档保存在具有该演示文稿的ID编号的子目录中(因此,如果“非常重要的演示文稿”在ID为3的数据库中,则应存储相关的材料在location settings.MEDIA_ROOT / documents / 3 / whateverdocname.txt)。

然而,当上面的代码“有效”时,它会创建一个子目录,而不是名为“3”,而是名为<django.db.models.fields.related.ForeignKey object at 0x8e358ec>,或者那种东西。我尝试过使用“id_presentations.name”,“id_presentations.value”等,但这些属性似乎并不存在。我似乎无法找到一个方法来获取ForeignKey字段的整数值,以便我可以将其转换为字符串并将其用作子目录名称。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

从Django 1.0开始,FileFields的upload_to参数可以是可调用的。如果我正确理解你的意图,那么这样的事情应该可以解决问题:

def material_path(instance, filename):
    return 'documents/%d' % instance.id_presentations.id

class Materials(models.Model):
    id_presentations = models.ForeignKey(Presentations)
    document = models.FileField(upload_to=material_path)
    docname = models.CharField(max_length=40)

该模型已经简化了一点,但希望它说明了解决方案。如果upload_to是可调用的,那么每次上传文件时,Django都会调用该函数,并传递两个参数:附加文件的实例和原始文件名。您可以通过从相关实例中提取演示文稿的ID来生成所需的文件路径。

更多信息: http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield

答案 1 :(得分:0)

如果您的Presentation模型定义了“name”属性,那么如果您正在使用模型的特定实例,那么您想要的应该是什么。像这样:

from models import Materials
obj = Materials.objects.get([some criteria here])
name = obj.id_presentation.name

如果您想将其抽象为模型上的方法,可以这样做:

class Materials(models.Model):
    def id_presentation_name(self):
        return self.id_presentation.name

如果你想要对象的数据库id,你可以访问object.id或object.pk。

答案 2 :(得分:0)

注意:你总是可以通过调用dir(object)找出python中对象的可用属性和方法。