【问题标题】:Django: automatically choose model based on parameters entered in as another models valuesDjango:根据作为另一个模型值输入的参数自动选择模型
【发布时间】:2013-01-21 05:45:38
【问题描述】:

我正在创建一个 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. 将使用“avi,mpg,mp4,mkv”创建视频文件类型,使用“mp3,flac”创建音乐等等。
  2. Django 应用程序将在 Video1.avi、Video2.mpg、Song1.mp3、Song2.flac 等上运行。它们将作为文件对象输入到数据库中。
  3. 在保存 File 对象时,应用会查看文件扩展名,将其与列表进行比较,然后选择由 FileType 模型布置的适当模型。

我希望将模型选择参数保留为数据库条目,这样我就可以添加或删除而无需更改应用程序。

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

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

【问题讨论】:

    标签: python django database-design django-apps


    【解决方案1】:

    如果我必须做你想做的事,我会让FileType 模型包含另一个名为file_type_model_classCharField。它将包含模型类的名称,例如Music。您可以使用以下方式实例化您的类:

    ft = FileType.objects.get(pk = some_id)
    module = __import__('ff.models')
    class_ = getattr('ff.models', ft.file_type_model_class)
    instance = class_()
    

    【讨论】:

      【解决方案2】:

      如果您尝试将文件实例与视频或音乐之一相关联,您可能想尝试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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 2015-05-29
        • 2018-05-20
        • 2021-03-27
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多