Django:根据输入的参数自动选择模型作为另一个模型值

时间:2013-02-06 05:17:43

标签: python django database-design django-apps

我正在创建一个Django文件浏览器应用程序,用于抓取文件并使元数据可供查看和搜索。

在最初作为“文件”对象输入文件后,我想根据文件的扩展名创建“视频”,“音乐”或“文档”。

一些模拟模型......

class File(models.Model):
    createdate = models.DateTimeField('date file entered', db_index=True, auto_now_add=True)
    cdate = models.DateTimeField()
    hash = models.CharField(max_length=14, default=_make_hash, unique=True)
    slug = models.SlugField(blank=True, unique=True)
    filename = models.CharField(db_index=True, max_length=2048)
    fullpath = models.CharField(max_length=2048)
    folder = models.CharField(max_length=2048)


class Video(models.Model):
    createdate = models.DateTimeField('date file entered', db_index=True, auto_now_add=True)
    imdblink = models.CharField(max_length=2048)
    container = models.CharField(max_length=2048)


class Music(models.Model):
    createdate = models.DateTimeField('date file entered', db_index=True, auto_now_add=True)
    bitrate = models.CharField(max_length=2048)
    artistname = models.CharField(max_length=2048)
    songname = models.CharField(max_length=2048)


class FileType(models.Model):
    typename = models.CharField(max_length=256)
    extension = models.ForeignKey(FileExtension)


class FileExtension(models.Model):
    extension = models.CharField(max_length=256)
  1. 视频的FileType将使用“avi,mpg,mp4,mkv”创建,音乐带有“mp3,flac”等等。
  2. Django应用程序将在Video1.avi,Video2.mpg,Song1.mp3,Song2.flac等上运行。它们将作为File对象输入数据库。
  3. 在保存File对象时,应用程序将查看文件扩展名,将其与列表进行比较,并选择由FileType模型布置的适当模型。
  4. 我希望将模型选择参数保留为数据库条目,这样我就可以添加或删除而无需更改应用程序。

    我不确定如何引用我希望FileType条目的模型。

    任何建议或意见都将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果我必须执行您要执行的操作,我会将FileType模型包含另一个名为CharField的{​​{1}}。它将包含模型类的名称,例如file_type_model_class。您可以使用以下内容实例化您的类:

Music

答案 1 :(得分:0)

如果您尝试将文件实例与视频或音乐相关联,则可能需要尝试Generic Foreign Key

class File(models.Model):
    # Your other fields...
    file_type = models.ForeignKey(ContentType,
        limit_choices_to={"model__in": ("video", "music")},
        help_text=_("Is this video or music?"))
    file_id = models.PositiveIntegerField(
        help_text=_("Which specific video or music (by ID)?"))
    file_object = generic.GenericForeignKey(ct_field="file_type",
       fk_field="file_id")

    def save():
        # Do your work here on self.filename to determine self.file_type