2010-03-18 5 views
0

동일한 데이터베이스의 각 웹 사이트에 대한 개체 액세스 수를 계산하는 응용 프로그램이 있습니다.모델/관리자와 관련된 문제 쿼리

class Model(SimpleHitBase): 
    name = models.CharField(max_length=255) 
    url = models.CharField(max_length=255) 
    rss = models.CharField(max_length=255) 
    creation = AutoNowAddDateTimeField() 
    update = AutoNowDateTimeField() 

그래서, 내 문제는 이것이다 : 나는 Model.objects.all()를 호출 할 때, 나는 SQL (안 두)에 대한 하나 개의 요청을하고 싶은

class SimpleHit(models.Model): 
    """ 
    Hit is the hit counter of a given object 
    """ 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    site = models.ForeignKey(Site) 

    hits_total = models.PositiveIntegerField(default=0, blank=True) 

    [...] 

class SimpleHitManager(models.Manager): 
    def get_query_set(self): 
     print self.model._meta.fields 
     qset = super(SimpleHitManager, self).get_query_set() 
     qset = qset.filter(hits__site=settings.SITE_ID) 
     return qset 

class SimpleHitBase(models.Model): 
    hits = generic.GenericRelation(SimpleHit) 

    objects = SimpleHitManager() 

    _hits = None 

    def _db_get_hits(self, only=None): 
     if self._hits == None: 
      try: 
       self._hits = self.hits.get(site=settings.SITE_ID) 
      except SimpleHit.DoesNotExist: 
       self._hits = SimpleHit() 
     return self._hits 

    @property 
    def hits_total(self): 
     return self._db_get_hits().hits_total 

    [...] 

    class Meta: 
     abstract = True 

와 나는 같은 모델을 가지고있다. 이 경우 : 하나는 모델에 대한 정보가 있고 다른 하나는 히트에 대한 카운터 (hits_total)입니다. 내가 직접 hits.hits_total으로 전화 할 수 없기 때문입니다 (SITE_ID로 인해?). select_related을 시도했지만 작동하지 않는 것 같습니다.

질문 :자동으로 열을 추가 할 수 있습니까? 예 : (SELECT hits.hits_total, model.* FROM [...])을 쿼리 세트에 추가 할 수 있습니까? - 내 모델에 select_related 기능을 사용 하시겠습니까?

이 모델이 다른 기존 모델에 모두 연결될 수 있기를 바랍니다.

답변

1

나는 대답을 찾았으므로 관리자를 변경했으며 이제 열은 db 요청에 추가됩니다.

select = { 
     'hits': 'hits_simplehit.hits_total', 
    } 
    qset = super(SimpleHitManager, self).get_query_set() 
    qset = qset.extra(select=select) 
    qset = qset.filter(hits_rel__site=settings.SITE_ID) 
    return qset 

감사합니다 :)

0

오브젝트 당 하나의 데이터베이스 히트를 수행하여 성능에 미치는 영향을 고려 했습니까?

개체가 적은 경우 전체 테이블을 메모리에 유지하고 디스크 쓰기를 비동기 (백그라운드) 작업으로 보냅니다.