I have a need to only get one record from a queryset_set. (as it only returns 1. so I have used .0 or .first() normally.
However at the moment when I use .0 I do not get any data. when I use .first() I get duplicated queries (despite the prefetch)
I have tried to use a sub query but from the samples ive seen I am unable to interpret it to suit my needs.
The query which generates duplicate when using first but nothing when using 0
circuits = SiteCircuits.objects.all() \
.exclude(circuit__decommissioned=True) \
.select_related('site') \
.select_related('circuit') \
.prefetch_related(
Prefetch(
'circuit__devicecircuitsubnets_set',
queryset=DeviceCircuitSubnets.objects.all().select_related('subnet')
) \
) \
in the template:
{% for item in circuits %}
{{ item.circuit.devicecircuitsubnets_set.0.subnet }}{{ item.circuit.devicecircuitsubnets_set.0.mask }}
...
models:
class Circuit(models.Model):
name = models.CharField(max_length=200, verbose_name="Name")
order_no = models.CharField(max_length=200, verbose_name="Order No")
ref_no = models.CharField(max_length=200, verbose_name="Reference No")
expected_install_date = models.DateField()
install_date = models.DateField(blank=True, null=True)
...
class SiteCircuits(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
circuit = models.ForeignKey(Circuit, on_delete=models.CASCADE)
site_count = models.IntegerField(verbose_name="How many sites circuit is used at?", blank=True, null=True)
active_link = models.BooleanField(default=False, verbose_name="Active Link?")
class Device(models.Model):
site = models.ForeignKey(Site, verbose_name="Site device belongs to", on_delete=models.PROTECT)
hostname = models.CharField(max_length=200)
class Subnet(models.Model):
subnet = models.GenericIPAddressField(protocol='IPv4', \
verbose_name="Subnet", blank=True, null=True)
mask = models.CharField(max_length=4, verbose_name="Mask", \
class DeviceCircuitSubnets(models.Model):
device = models.ForeignKey(Device, on_delete=models.CASCADE)
circuit = models.ForeignKey(Circuit, on_delete=models.CASCADE, blank=True, null=True)
subnet = models.ForeignKey(Subnet, on_delete=models.CASCADE)
sample output in console:
>>> circuits[100].circuit.devicecircuitsubnets_set.first().subnet.subnet
'10.10.10.4'
>>> circuits[100].circuit.devicecircuitsubnets_set.all()[0].subnet.subnet
'10.10.10.4'
>>>