2013-02-06 4 views
2

파일을 크롤링하고 볼 수 있고 검색 할 수 있도록 장고 파일 브라우저 앱을 만듭니다.Django : 다른 모델 값으로 입력 된 매개 변수를 기반으로 모델을 자동으로 선택합니다.

처음 파일을 "파일"개체로 입력 한 후 파일 확장명을 기준으로 "비디오", "음악"또는 "문서"를 만들고 싶습니다.

일부 모의 모델 ... 비디오의 파일 타입은 그래서 "MP3, FLAC"와와 "AVI, MPG, MP4, MKV,"음악으로 생성 될 수

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. .
  2. Django 앱은 Video1.avi, Video2.mpg, Song1.mp3, Song2.flac 등을 통해 실행됩니다. 데이터베이스에 File 객체로 입력됩니다.
  3. File 개체를 저장하면 응용 프로그램에서 파일 확장명을보고 목록과 비교하고 FileType 모델에 의해 배치 된 적절한 모델을 선택합니다.

모델 선택 매개 변수를 데이터베이스 항목으로 유지하여 앱을 변경하지 않고 추가하거나 제거 할 수 있기를 바랍니다.

FileType 항목을 원하는 모델을 참조하는 방법이 확실하지 않습니다.

조언이나 의견을 보내 주시면 감사하겠습니다.

답변

0

내가하려는 일을 수행해야한다면 FileType 모델에 이라는 CharField이 포함될 것입니다. Music과 같은 모델 클래스의 이름을 포함합니다. 당신은 같은 것을 사용하여 클래스를 인스턴스화 할 수 있습니다 : 당신이 비디오 또는 음악 중 하나에 파일 인스턴스를 관련하려는 경우

ft = FileType.objects.get(pk = some_id) 
module = __import__('ff.models') 
class_ = getattr('ff.models', ft.file_type_model_class) 
instance = class_() 
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