|
|
@@ -2,6 +2,7 @@ import netaddr
|
|
|
from django.conf import settings
|
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
|
|
from django.db.models import Count, Q
|
|
|
+from django.db.models.expressions import RawSQL
|
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
|
from django.views.generic import View
|
|
|
from django_tables2 import RequestConfig
|
|
|
@@ -291,10 +292,10 @@ class RIRBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
|
class AggregateListView(PermissionRequiredMixin, ObjectListView):
|
|
|
permission_required = 'ipam.view_aggregate'
|
|
|
- # TODO: Replace raw SQL
|
|
|
- queryset = Aggregate.objects.prefetch_related('rir').extra(select={
|
|
|
- 'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix',
|
|
|
- })
|
|
|
+ queryset = Aggregate.objects.prefetch_related('rir').annotate(
|
|
|
+ child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
|
|
|
+ )
|
|
|
+
|
|
|
filter = filters.AggregateFilter
|
|
|
filter_form = forms.AggregateFilterForm
|
|
|
table = tables.AggregateDetailTable
|