2

ファイルをクロールし、メタデータを表示および検索できるようにする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モデルによってレイアウトされた適切なモデルを選択します。

アプリを変更せずに追加または削除できるように、モデル選択パラメーターをデータベースエントリとして保持したいと考えています。

FileTypeエントリをどのモデルにするかがわかりません。

任意のアドバイスや入力をいただければ幸いです。

4

2 に答える 2

0

ファイルインスタンスをビデオまたは音楽のいずれかに関連付けようとしている場合は、GenericForeignKeyを試してみてください

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
于 2013-02-06T13:44:23.590 に答える
0

あなたがやろうとしていることをしなければならない場合は、FileTypeモデルに というCharField名前の別のものを含めますfile_type_model_class。などのモデル クラスの名前が含まれMusicます。次のようなものを使用して、クラスをインスタンス化できます。

ft = FileType.objects.get(pk = some_id)
module = __import__('ff.models')
class_ = getattr('ff.models', ft.file_type_model_class)
instance = class_()
于 2013-02-06T05:27:24.837 に答える