Ive added a prefetch to django admin as I noticed it was running nearly 1000 queries for a model.
However the prefetch seems to have had zero effect. as far as I can see the prefetch query is correct?
example duplicate:
SELECT "sites_sitedata"."id", "sites_sitedata"."location", "sites_sitedata"."
...
FROM "sites_sitedata" WHERE "sites_sitedata"."id" = '7'
Duplicated 314 times.
0.09126367597049141%
0.24
Sel Expl
Connection: default
/itapp/itapp/circuits/models.py in __str__(88)
return '%s | %s | %s | %s ' % (self.site_data.location, \
there are also duplicates for, circuit providers, and circuit types glancing at a high level
admin.py
class SiteSubnetsAdmin(admin.ModelAdmin):
search_fields = ['site_data','device_data','subnet','subnet_type','vlan_id','peer_desc']
list_display = ('site_data','device_data','subnet','subnet_type','vlan_id','peer_desc')
ordering = ('site_data','device_data',)
def get_queryset(self, request):
queryset = super(SiteSubnetsAdmin, self).get_queryset(request)
queryset = SiteSubnets.objects \
.prefetch_related(
Prefetch(
'circuit',
queryset=Circuits.objects.prefetch_related('site_data').prefetch_related('service_contacts').prefetch_related('circuit_type').prefetch_related('provider'),
),
) \
.prefetch_related('site_data') \
.prefetch_related('device_data') \
.prefetch_related('subnet_type')
return queryset
admin.site.register(SiteSubnets, SiteSubnetsAdmin)
subnets.models
class SiteSubnets(models.Model):
device_data = models.ForeignKey(DeviceData, verbose_name="Device", \
on_delete=models.PROTECT, blank=True, null=True)
site_data = models.ForeignKey(SiteData, verbose_name="Location", \
on_delete=models.PROTECT, blank=True, null=True)
subnet = models.GenericIPAddressField(protocol='IPv4', \
verbose_name="Subnet", blank=True, null=True)
subnet_type = models.ForeignKey(SubnetTypes, verbose_name="Subnet Type")
circuit = models.ForeignKey(Circuits, verbose_name="Link to circuit?", \
on_delete=models.PROTECT, blank=True, null=True)
vlan_id = models.IntegerField(verbose_name="Vlan ID", blank=True, null=True)
peer_desc = models.IntegerField(verbose_name="Peer description", blank=True, null=True)
class Meta:
verbose_name = "Site Subnets"
verbose_name_plural = "Site Subnets"
def __str__(self):
if self.device_data != None:
return '{0} - {1} - {2}'.format(self.site_data,self.device_data, self.subnet)
else:
return '{0} - {1}'.format(self.site_data, self.subnet)
circuits.models
class Circuits(models.Model):
site_data = models.ForeignKey(SiteData, verbose_name="Site", on_delete=models.PROTECT)
order_no = models.CharField(max_length=200, verbose_name="Order No")
expected_install_date = models.DateField()
install_date = models.DateField(blank=True, null=True)
circuit_type = models.ForeignKey(CircuitTypes, verbose_name="Circuit Type", on_delete=models.PROTECT)
circuit_preference = models.CharField(max_length=20, verbose_name="Circuit Preference", \
choices=settings.CIRCUIT_PREFERENCE, blank=True, null=True)
provider = models.ForeignKey(CircuitProviders, verbose_name="Circuit Provider", on_delete=models.PROTECT)
service_contacts = models.ForeignKey(ServiceContacts, on_delete=models.PROTECT)
subnet_mask = models.CharField(max_length=4, verbose_name="Subnet Mask", \
choices=settings.SUBNET_MASK_CHOICES, blank=True, null=True)
decommissioned = models.BooleanField(default=False, verbose_name="Decomission this circuit?")
active_link = models.BooleanField(default=False, verbose_name="Active Link?")
class Meta:
verbose_name = "Circuit Data"
verbose_name_plural = "Circuit Data"
permissions = (
("can_view_financial", "Can View Financial"),
("can_view_orders", "Can View Orders"),
)
def __str__(self):
return '%s | %s | %s | %s ' % (self.site_data.location, \
self.provider, self.circuit_type, self.ref_no)
EDIT would this be the method stored separately? in the same model or does it need to be external to the model?
def full_info(self):
return '{} | {} | {} | {}'.format(self.site_data.location, \
self.provider, self.circuit_type, self.ref_no)
def __str__(self):
return '{} | {} | {}'.format(self.provider, self.circuit_type, self.ref_no)