我有一个基本的 LoggedEvent 模型和许多子类模型,如下所示:
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)
用户在执行相关操作时会生成这些事件。我正在尝试生成每个用户在上个月引起的每种事件类型的使用情况报告。我在 Django 的 ORM 上苦苦挣扎,当我接近时,我遇到了一个问题。下面是查询代码:
def 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))
ldapusage 和 authusage 都是用户列表,每个用户都使用 .count 属性进行注释,该属性应该表示用户生成了多少特定事件。但是,在这两个列表中, .count 属性是相同的值。事实上,带注释的“计数”等于用户生成的事件数,无论类型如何。所以看起来我的具体
authusage = baseusage.exclude(loggedevent__authevent__id__lt=1)
不按子类排除。我尝试过 id__lt=1、id__isnull=True 等。哈尔普。