Annotate over Multi-table Inheritance in Django

Posted by user341584 on Stack Overflow See other posts from Stack Overflow or by user341584
Published on 2010-05-14T20:32:47Z Indexed on 2010/05/14 20:34 UTC
Read the original article Hit count: 491

Filed under:
|
|

I have a base LoggedEvent model and a number of subclass models like follows:

class LoggedEvent(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)

class AuthEvent(LoggedEvent):
    good = models.BooleanField()
    username = models.CharField(max_length=12)

class LDAPSearchEvent(LoggedEvent):
    type = models.CharField(max_length=12)
    query = models.CharField(max_length=24)

class PRISearchEvent(LoggedEvent):
    type = models.CharField(max_length=12)
    query = models.CharField(max_length=24)

Users generate these events as they do the related actions. I am attempting to generate a usage-report of how many of each event-type each user has caused in the last month. I am struggling with Django's ORM and while I am close I am running into a problem. Here is the query code:

ef usage(request): # Calculate date range today = datetime.date.today() month_start = datetime.date(year=today.year, month=today.month - 1, day=1) month_end = datetime.date(year=today.year, month=today.month, day=1) - datetime.timedelta(days=1)

# Search for how many LDAP events were generated per user, last month
baseusage = User.objects.filter(loggedevent__timestamp__gte=month_start, loggedevent__timestamp__lte=month_end)
ldapusage = baseusage.exclude(loggedevent__ldapsearchevent__id__lt=1).annotate(count=Count('loggedevent__pk'))
authusage = baseusage.exclude(loggedevent__authevent__id__lt=1).annotate(count=Count('loggedevent__pk'))

return render_to_response('usage.html', {
    'ldapusage' : ldapusage,
    'authusage' : authusage,
}, context_instance=RequestContext(request))

Both ldapusage and authusage are both a list of users, each user annotated with a .count attribute which is supposed to represent how many particular events that user generated. However in both lists, the .count attributes are the same value. Infact the annotated 'count' is equal to how many events that user generated, regardless of type. So it would seem that my specific

authusage = baseusage.exclude(loggedevent__authevent__id__lt=1)

isn't excluding by subclass. I have tried id_lt=1, id_isnull=True, and others. Halp.

© Stack Overflow or respective owner

Related posts about django-orm

Related posts about django