Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-预取查询在相关映射表上不起作用_Django - Fatal编程技术网

Django-预取查询在相关映射表上不起作用

Django-预取查询在相关映射表上不起作用,django,Django,我试图在遍历多个映射表时预取并选择一些相关的外键模型。然而,我仍然要处理500多个查询,我设法将其从1000个降到1000个,但看起来子网字段并没有被提取 我尝试了以下方法: circuits = SiteCircuits.objects.all() \ .exclude(circuit__decommissioned=True) \ .select_related('site') \

我试图在遍历多个映射表时预取并选择一些相关的外键模型。然而,我仍然要处理500多个查询,我设法将其从1000个降到1000个,但看起来子网字段并没有被提取

我尝试了以下方法:

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')
                                    )
                             ) \
                            .prefetch_related('circuit__circuitnotes_set') \
                            .prefetch_related('circuit__circuit_type') \
                            .prefetch_related('circuit__circuitfile') \
                            .prefetch_related('circuit__service_provider') \
                            .prefetch_related('circuit__circuit_type')
这样也可以:

circuits = SiteCircuits.objects.all() \
                            .exclude(circuit__decommissioned=True) \
                            .select_related('site') \
                            .select_related('circuit') \
                            .prefetch_related('circuit__devicecircuitsubnets_set') \
                            .prefetch_related('circuit__devicecircuitsubnets_set__subnet') \
                            .prefetch_related('circuit__circuitnotes_set') \
                            .prefetch_related('circuit__circuit_type') \
                            .prefetch_related('circuit__circuitfile') \
                            .prefetch_related('circuit__service_provider') \
                            .prefetch_related('circuit__circuit_type')
但我有500多个以下查询,我想我可以通过选择子网上的相关查询得到:

SELECT "config_devicecircuitsubnets"."id", "config_devicecircuitsubnets"."device_id", "config_devicecircuitsubnets"."circuit_id", "config_devicecircuitsubnets"."subnet_id", "circuits_circuit"."id", "circuits_circuit"."name", "circuits_circuit"."order_no", "circuits_circuit"."ref_no", "circuits_circuit"."expected_install_date", "circuits_circuit"."install_date", "circuits_circuit"."circuit_type_id", "circuits_circuit"."preference", "circuits_circuit"."service_provider_id", "circuits_circuit"."username", "circuits_circuit"."password", "circuits_circuit"."tel_no", "circuits_circuit"."cost_per_month", "circuits_circuit"."contract_length", "circuits_circuit"."speed_down", "circuits_circuit"."speed_up", "circuits_circuit"."rssi", "circuits_circuit"."bearer", "circuits_circuit"."decommissioned", "config_subnet"."id", "config_subnet"."subnet", "config_subnet"."mask", "config_subnet"."subnet_type_id" FROM "config_devicecircuitsubnets" INNER JOIN "circuits_circuit" ON ("config_devicecircuitsubnets"."circuit_id" = "circuits_circuit"."id") INNER JOIN "config_subnet" ON ("config_devicecircuitsubnets"."subnet_id" = "config_subnet"."id") WHERE "config_devicecircuitsubnets"."circuit_id" = '1' ORDER BY "config_devicecircuitsubnets"."id" ASC LIMIT 1
  Duplicated 526 times.
线路错误:

{{ item.circuit.devicecircuitsubnets_set.first.subnet }}{{ item.circuit.devicecircuitsubnets_set.first.mask }}
高级模型:

-Site
-Circuit
-Device 
-Subnet
--SiteCircuits (mapping table)
--DeviceCircuitSubnets (mapping table)
编辑:

我尝试了一个没有抛出任何错误的子查询,但我不确定它是否正确或者如何访问该字段

子查询示例:

circuit_subnet = DeviceCircuitSubnets.objects.filter(circuit=OuterRef('pk'))
circuits = SiteCircuits.objects.all() \
                        .exclude(circuit__decommissioned=True) \
                        .select_related('site') \
                        .select_related('circuit') \
                        .prefetch_related('circuit__devicecircuitsubnets_set') \
                        .prefetch_related('circuit__devicecircuitsubnets_set__subnet') \
                        .prefetch_related('circuit__circuitnotes_set') \
                        .prefetch_related('circuit__circuit_type') \
                        .prefetch_related('circuit__circuitfile') \
                        .prefetch_related('circuit__service_provider') \
                        .prefetch_related('circuit__circuit_type') \
                        .annotate(circuit__devicecircuitsubnets_set=Subquery(circuit_subnet.values('subnet')[:1]))

使用
.first
可能会导致其他查询。尝试改用
.0

{{ item.circuit.devicecircuitsubnets_set.first.subnet }}{{ item.circuit.devicecircuitsubnets_set.first.mask }}

如果您只需要预取第一个相关项,则可以使用。

更改为.0工作,i;我尝试了一个子查询并将其添加到问题中,但实际查询只返回1个值,但我不能使用带有预回迁的get,可以吗?我不理解您的问题。也许会有帮助。