Django - Problem with models/manager to organise a query...

Posted by user296644 on Stack Overflow See other posts from Stack Overflow or by user296644
Published on 2010-03-18T15:36:28Z Indexed on 2010/03/19 17:21 UTC
Read the original article Hit count: 160

Filed under:
|
|

Hi,

I have an application to count the number of access to an object for each website in a same database.

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

And I have a model like:

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()

So, my problem is this one: when I call Model.objects.all(), I would like to have one request for the SQL (not two). In this case: one for Model in order to have information and one for the hits in order to have the counter (hits_total). This is because I cannot call directly hits.hits_total (due to SITE_ID?). I have tried select_related, but it seems to do not work...

Question: - How can I add column automatically like (SELECT hits.hits_total, model.* FROM [...]) to the queryset? - Or use a functional select_related with my models?

I want this model could be plugable on all other existing model.

Thank you,

Best regards.

© Stack Overflow or respective owner

Related posts about django

Related posts about models