Fixed a performance issue with django's ORM

pull/43/head
Piero Toffanin 2016-11-10 12:26:04 -05:00
rodzic 6732e6aba6
commit 84541569bf
6 zmienionych plików z 23 dodań i 8 usunięć

Wyświetl plik

@ -6,7 +6,6 @@ from .tasks import TaskIDsSerializer
class ProjectSerializer(serializers.ModelSerializer):
owner = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
tasks = TaskIDsSerializer(many=True)
class Meta:

Wyświetl plik

@ -16,6 +16,7 @@ class TaskIDsSerializer(serializers.BaseSerializer):
def to_representation(self, obj):
return obj.id
class TaskSerializer(serializers.ModelSerializer):
project = serializers.PrimaryKeyRelatedField(queryset=models.Project.objects.all())
processing_node = serializers.PrimaryKeyRelatedField(queryset=ProcessingNode.objects.all())
@ -26,7 +27,7 @@ class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = models.Task
exclude = ('processing_lock', 'console_output', )
exclude = ('processing_lock', 'console_output', 'orthophoto', )
def get_and_check_project(request, project_pk, perms=('view_project',)):
@ -48,7 +49,7 @@ class TaskViewSet(viewsets.ViewSet):
A task represents a set of images and other input to be sent to a processing node.
Once a processing node completes processing, results are stored in the task.
"""
queryset = models.Task.objects.all()
queryset = models.Task.objects.all().defer('orthophoto', 'console_output')
# We don't use object level permissions on tasks, relying on
# project's object permissions instead (but standard model permissions still apply)
@ -157,10 +158,10 @@ class TaskViewSet(viewsets.ViewSet):
class TaskTilesBase(APIView):
queryset = models.Task.objects.all()
def get_and_check_task(self, request, pk, project_pk):
def get_and_check_task(self, request, pk, project_pk, defer=(None, )):
get_and_check_project(request, project_pk)
try:
task = self.queryset.get(pk=pk, project=project_pk)
task = self.queryset.defer(*defer).get(pk=pk, project=project_pk)
except ObjectDoesNotExist:
raise exceptions.NotFound()
return task
@ -171,7 +172,7 @@ class TaskTiles(TaskTilesBase):
"""
Returns a prerendered orthophoto tile for a task
"""
task = self.get_and_check_task(request, pk, project_pk)
task = self.get_and_check_task(request, pk, project_pk, ('orthophoto', 'console_output'))
tile_path = task.get_tile_path(z, x, y)
if os.path.isfile(tile_path):
tile = open(tile_path, "rb")

Wyświetl plik

@ -41,7 +41,7 @@ class Project(models.Model):
return self.name
def tasks(self, pk=None):
return Task.objects.filter(project=self);
return Task.objects.filter(project=self).only('id')
class Meta:
permissions = (

Wyświetl plik

@ -2,6 +2,7 @@ anyjson==0.3.3
APScheduler==3.2.0
Django==1.10
django-common-helpers==0.8.0
django-debug-toolbar==1.6
django-filter==0.15.3
django-guardian==1.4.6
django-webpack-loader==0.3.3
@ -10,13 +11,14 @@ drf-nested-routers==0.11.1
funcsigs==1.0.2
futures==3.0.5
Markdown==2.6.7
pillow==3.3.1
Pillow==3.3.1
pip-autoremove==0.9.0
psycopg2==2.6.2
pytz==2016.6.1
requests==2.11.1
rfc3987==1.3.7
six==1.10.0
sqlparse==0.2.2
strict-rfc3339==0.7
tzlocal==1.3
webcolors==1.5

Wyświetl plik

@ -25,6 +25,7 @@ SECRET_KEY = 'gmarsutd!fee6_58=6k)2je#o2^&&)ovu1svjg8k^(a!7qa7r&'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
INTERNAL_IPS = ['127.0.0.1']
ALLOWED_HOSTS = []
@ -43,11 +44,13 @@ INSTALLED_APPS = [
'rest_framework',
'rest_framework_nested',
'webpack_loader',
# 'debug_toolbar',
'app',
'nodeodm',
]
MIDDLEWARE = [
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',

Wyświetl plik

@ -15,6 +15,7 @@ Including another URLconf
"""
from django.conf.urls import include, url
from django.contrib import admin
from . import settings
admin.site.site_header = 'WebODM Administration'
@ -23,3 +24,12 @@ urlpatterns = [
url(r'^', include('django.contrib.auth.urls')),
url(r'^admin/', admin.site.urls),
]
if settings.DEBUG:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
#from django.contrib.staticfiles.urls import staticfiles_urlpatterns
#urlpatterns += staticfiles_urlpatterns()