2012-04-22 4 views
0

세 가지 모델이 있습니다.Django에서 여러 모듈을 연결하는 방법은 무엇입니까?

class Picture(models.Model) 
    name = models.CharField(max_length=255) 
    image_field = models.ImageField(upload_to="foo/") 
    slug = models.SlugField() 
    [...] 


class Size(models.Model): 
    name = models.CharField(max_length=255) 
    width = models.IntegerField() 
    height = models.IntegerField() 
    crop = models.BooleanField(default=True) 
    upscale = models.BooleanField(default=False) 

    def __unicode__(self): 
    return self.name 

class Cache(models.Model): 
    size = models.ForeignKey('Size') 
    picture = models.ForeignKey('Picture') 
    image_field = models.ImageField(upload_to="picture/resize/") 

다음과 같이 사용하고 싶습니다. 먼저 그림 개체를 생성하십시오. 그런 다음 크기 객체를 만듭니다. 모든 크기 및 그림에 대해 필요할 때 캐시 객체를 생성해야합니다.

제 문제는 코드를 어디에 넣어야할지 모르겠다는 것입니다. 그것은 (유사 코드)와 같아야합니다 :

def get_cached_picture(Picture,Size): 
    try: 
    cacheObj = Cache.objects.get(picture=Picture, size=Size): 
    [.. use cacheObj ..] 
    except Cache.DoesNotExist: 
    [.. resize Picture according to Size, insert into cache, use it ..] 

그래서이 코드를 어디에 연결할 수 있습니까? 내가보기에서 이것을 할 수 있다는 것을 알고 있지만 모델에 그것을 포함시키는 방법이 있습니까? 캐시는 관리자에서 채워서는 안되며 캐시와 그림 사이의 특정 조합이 필요할 때마다 생성되어야합니다.

아마도 쉽게 할 수 있지만 Google에 적합한 키워드가 부족합니다.

+0

몇 가지 질문 ... 당신은 당신의 그림으로 크기를 연결하기 위해 별도의 모델을 필요합니까 왜 때 picture.imagefield는 모델의 너비와 높이를 저장합니다. 캐시 모델의 목적은 무엇입니까? 이미지 데이터를 복제하는 것 같습니다.모델 스 니펫을 게시하고 찾으려는 정확한 코드와는 대조적으로 달성하려는 것을 조금 더 설명 할 수 있습니까? – jdi

+0

이 목적은 여러 크기의 그림을 갖는 것입니다. 그림 모듈은 원본 이미지를 보유하고 캐시 모듈은 여러 개의 크기 조정 된 버전을 보유합니다. 답장을 보내 주셔서 감사합니다. 제 질문을 개선하려고 노력할 것입니다. – JasonTS

+1

아 맞습니다. 그 정보는 분명 도움이됩니다. 캐시 모델은 실제로 더 많은 버전입니다. 나는 당신이 캐싱을 수동으로 시도함으로써 잘못된 길로 가고 있다고 생각하기 시작했다. 모델을 표시하기 위해 질문을 업데이트하고이 사용법의 예를 보여주십시오. – jdi

답변

2

가정 :

  1. 당신은 즉석에서 특정 크기에 이미지의 "표현"을로드 할 수 있어야합니다.
  2. 크기 모델에는 표현에서 가질 수있는 미리 정의 된 크기 세트가 저장됩니다.

나는 내가 여기 맥락에서 더 의미가 생각하기 때문에 표현로 캐시 모델을 참조하기 위하여려고하고있다.

이 프로세스의 진입 점은 분명히보기가됩니다. 요청이 들어오고 "Image1.jpg"@ 800x600을 검색해야한다고 결정했습니다. 가장 간단한 방법은 쿼리를 뷰에 바로 넣는 것입니다. 당신이 이미 있기 때문에,

  • 다음보기에서 호출되는 유틸리티 함수는
  • 당신의 대표 모델의 classmethod 표현 개체를 검색 할 :하지만 재사용을 위해, 다음 중 하나를 수행하는 것이 좋습니다 수 있습니다 그림 및 크기를 외래 키로 참조합니다.
  • 다른 사람이 자신의 의견을 가지고 있다면 이러한 요소가 응용 프로그램으로 재사용 할 것이다 위의

비슷한 작업을 수행 할 대표 모델에 custom manager를 사용하여 단순히 담당자의 인스턴스를 검색하는 데 필요한 직접.

의사 코드가 그림 모드에있는이 프로세스를 참조하는 동안 외부 키가 모두 포함되어있어 적절한 대리인이 있는지 쉽게 확인할 수 있기 때문에 표현 모델에 있어야한다고 주장합니다. 그렇지 않다면 생성하십시오. 모든 로직을 가진 반대로

보기는 단순한 뭔가를 호출해야한다 :

# as classmethod 
rep = Representation.get_cached_picture(picture, size) 
# or with a manager 
rep = Representation.objects.get_cached_picture(picture, size) 
+0

덕분에, 그게 많이 도움이됩니다 :) – JasonTS

+0

@JasonTS : Anytime! 질문을 업데이트 해 주셔서 감사합니다. 모델 코드를 보았을 때 시각화하는 것이 훨씬 쉬워졌고 정확히 어떻게 사용하고 싶은지 말할 수있었습니다. – jdi

관련 문제