2012-03-14 3 views
1

내 장고 앱 중 하나에 이미지 필드가 있지만 수정 순서대로 목록을 표시 할 수 있도록 이미지 리비전을 저장할 수 있기를 원합니다. 이미지를 별도로 저장 한 다음 부모 이미지에 '부모'ForeignKey 관계를 설정하는 가장 좋은 방법은 무엇입니까? 예를 들면 :부모 - 자식 관계 효율성

class Image(models.Model): 
    name = models.CharField(max_length=50) 
    parent = models.ForeignKey(Image, null=True) 
    image = models.ImageField(upload_to='images') 

부모 (null=True) 다음 이미지가 더 수정이 없어야합니다이없는 경우. 각 객체에는 부모와 자식이 하나만있을 수 있지만 레이어 수에는 제한이 없습니다.

상당수의 SQL 쿼리를 생성하지 않으면 여러 층의 하위 레이어를 통과 할 수 있는지 여부를 알 수 없으므로 앱이 매우 비효율적입니다. Django 객체의 관점에서 이것을 표현하는 가장 좋은 방법은 무엇입니까? 예를 들어 레이어를 처리하는 것과 같이 별도의 'ImageRevision'객체를 갖는 것이 더 좋습니까? 나는 가능성이 경우에 어떻게 할 것인지

감사

답변

1

I 효율적으로이 작업을 수행하는 두 가지 방법을 참조 : 수, 그것은에 사용되는 모델에

  1. 타이 Image을 일대 이미지의 :

    class Image(models.Model): 
        obj = models.ForeignKey(MyModel, related_name='images') 
        name = models.CharField(max_length=50) 
        image = models.ImageField(upload_to='images') 
        created = models.DateTimeField(auto_now_add=True) 
    
        class Meta: 
         ordering = ['-created'] 
         get_latest_by = 'created' 
    

    다음을 수행하여 최신 개정판을 얻을 수 있습니다.

    my_model_instance.images.latest() 
    
  2. 언급 한대로 ImageRevision 모델을 만들고이를 Image에 연결합니다. 당신이 현명하게 사용하여 해당을 완화 할 수 있어야하지만

    my_model_instance.image.revisions.latest() 
    

두 번째 방법은 (추가 관계에 대한 추가 질의를 포함한다 :

class Image(models.Model): 
    name = models.CharField(max_length=50) 

class ImageRevision(models.Model): 
    parent = models.ForeignKey(Image, related_name='revisions') 
    image = models.ImageField(upload_to='images') 
    created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     ordering = ['-created'] 
     get_latest_by = 'created' 

그런 다음에 최신 버전을 얻을 수 있습니다 select_related)하지만 여러 가지 다른 모델과 함께 사용할 수있는 이점이 있지만 첫 번째 방법은 본질적으로 하나의 모델에 Image을 연결합니다.

+0

종합적이고 도움이되는 설명에 감사드립니다. – jvc26

0

는 별도의 수정 개체로 이동합니다. 이미지에서 부모 필드를 제거합니다 (단일 부모로부터 여러 자식을 방지하기 위해 ForeignKey 대신 OneToOne이됩니다). 다음 체인을 통해 재귀를 필요로하지 않습니다,

class Image(models.Model): 
    name = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.name 

class Revision(models.Model): 
    image = models.ForeignKey(Image) 
    revision_number = models.IntegerField() 
    file = models.ImageField(upload_to='images') 

이송 : 그래서, 당신은이 같은 이름을 가진 이미지 객체, 그리고 ImageField와 개정 객체를 가질 것입니다. 다음과 같은 것 :

for i in Image.objects.all(): 
    print i.name 
    for r in Revision.objects.filter(image=i).order_by('revision_number'): 
     print "rev. " + str(r.revision_number) + " " str(r.file) 

내가 어떻게 처리 할 것인가.

건배