代码之家  ›  专栏  ›  技术社区  ›  rossdavidh

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

  •  2
  • rossdavidh  · 技术社区  · 16 年前

    我正在开发一个django应用程序,用户可以上传各种各样的文档。my 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 回复  |  直到 16 年前
        1
  •  2
  •   Will McCutchen    16 年前

    从django 1.0开始,上传到filefields的参数可以是可调用的。如果我理解你的意图是正确的,那么这样的事情就可以做到:

    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

        2
  •  0
  •   Gabriel Hurley    16 年前

    如果“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。

        3
  •  0
  •   Gabriel Hurley    16 年前

    注意:通过调用dir(object),您总是可以了解在Python中对象上可用的属性和方法。