#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