首页 > 解决方案 > 如何优化 Django 与数据库表的交互

问题描述

请问如何优化这个功能?我有树表: Edges超过 77 000 行和 20 列 Nodes:超过 60 000 行和 20 列 RoadType:超过 30 行和 20 列

def optimizing(request, pk):
    degree_crs = "EPSG:4326"
    meter_crs = "EPSG:3857"

    road_network = RoadNetwork.objects.get(pk=road_network_id)

    # Retrieve all nodes of the road network as a GeoDataFrame.
    nodes = Node.objects.select_related('network').filter(network=road_network)
    columns = ['id', 'node_id', 'location']
    values = nodes.values_list(*columns)
    nodes_gdf = gpd.GeoDataFrame.from_records(values, columns=columns)
    nodes_gdf['location'] = gpd.GeoSeries.from_wkt(
        nodes_gdf['location'].apply(lambda x: x.wkt), crs=degree_crs)
    nodes_gdf.set_geometry('location', inplace=True)
    
    # Retrieve all edges of the road network as a GeoDataFrame.
    edges = Edge.objects.select_related('road_type', 'source',
                                        'target').filter(network=road_network)
    columns = ['edge_id', 'lanes', 'road_type', 'source', 'target', 'geometry']
    values = edges.values_list(*columns)
    edges_gdf = gpd.GeoDataFrame.from_records(values, columns=columns)
    
    # Retrieve all Road type of a network as DataFrame
    rtypes = RoadType.objects.filter(network=road_network)
    columns = ['id', 'default_lanes', 'color']
    values = rtypes.values_list(*columns)
    rtypes_df = pd.DataFrame.from_records(values, columns=columns)

模型.py

class Edge(models.Model):
    geometry = models.LineStringField(null=True)
    name = models.CharField(max_length=200, blank=False)
    target = models.ForeignKey(Node, on_delete=models.CASCADE)
    source = models.ForeignKey(Node, on_delete=models.CASCADE)
    network = models.ForeignKey(RoadNetWork, 
                                 on_delete=models.CASCADE)
    road_type = models.ForeignKey(RoadType, 
                                    on_delete=models.CASCADE)


class Node(models.Model):
    network = models.ForeignKey(RoadNetWork, 
                         on_delete=models.CASCADE)
    node_id = models.BigIntegerField()
    name = models.CharField('Node Name', max_length=200)
    location = models.PointField()


class RoadType(models.Model):
    network = models.ForeignKey(RoadNetwork, on_delete=models.CASCADE)
    road_type_id = models.SmallIntegerField()

标签: pythondjangopandasdataframegeopandas

解决方案


推荐阅读