Как преобразовать эти циклы в оптимизированные запросы Django

#django #django-models #postgis

Вопрос:

Не могли бы вы, пожалуйста, помочь мне оптимизировать этот вид? На выполнение этой работы уходит более 30 минут
. Я думаю, что проблема в запросах Django.cSomeone рекомендовал мне поместить все запросы
в список или словарь, я попробовал, но я не вижу, как вывести запросы Django.

вот модели узлов и краев

 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()
 
 def upload_edge(request, pk):

    template = "networks/edge.html"

    roadnetwork = RoadNetWork.objects.get(id=pk)
    road_type = RoadType.objects.get(pk=2)
    _node_instance_ = Node.objects.select_related('network').filter(network_id=pk)

    if request.method == 'POST':
        form = EdgeForm(request.POST, request.FILES)
        if form.is_valid():

            datafile = request.FILES['my_file']      
            objects = json.load(datafile) 
            L=[]
            for object in objects['features']:
                objet_type = object['geometry']['type']
                if objet_type == 'LineString':
                    properties = object['properties']
                    geometry = object['geometry']

                    point1 = geometry['coordinates'][0]
                    point2 = geometry['coordinates'][1]

                    location = GEOSGeometry(
                        LineString(geometry['coordinates']))

                    target = properties.get('target')
                    source = properties.get('source')
                    name = properties.get('name')
               
                    try:
                        target = _node_instance_.get(node_id=target)
                        source = _node_instance_.get(node_id=source)

                        node = Edge(
                                geometry=location,
                                road_type=road_type,
                                target=target,
                                source=source,
                                network=roadnetwork)
                        L.append(node)
                    except:
                        pass

            Edge.objects.bulk_create(L)

        return redirect('home')
    else:
        form = EdgeForm()
        return render(request, template, {'form': form})
 

Комментарии:

1. Для чего они предназначены target_node_instance и source_node_instance для чего используются? Просто отбросьте эти две строки и переместите фильтры по цели и источнику в строки ниже. Также не ясно, что network_id должен делать фильтр. Вы только что взяли экземпляр узла по первичному ключу , затем берете атрибуты из этого самого экземпляра, включая первичный ключ , и снова фильтруете ту же модель тем же ключом? По какой причине?

2. Можете ли вы включить свои Node определения и Edge определения классов?

3. @IvanStarostin target_node_instance и source_node_instance позволяют мне получить идентификатор сети и идентификатор узла

4. @Брэд Марцбергер Я просто добавляю модели узлов и краев.

5. Пожалуйста, помогите мне! Проблема в коде внутри блока try