improve queries in editor views

This commit is contained in:
Laura Klünder 2017-06-11 15:37:25 +02:00
parent 61fa8276b2
commit 1a30cb325e
2 changed files with 9 additions and 6 deletions

View file

@ -49,7 +49,7 @@ def main_index(request):
@sidebar_view
def level_detail(request, pk):
level = get_object_or_404(Level.objects.select_related('on_top_of'), pk=pk)
level = get_object_or_404(Level.objects.select_related('on_top_of').prefetch_related('levels_on_top'), pk=pk)
return render(request, 'editor/level.html', {
'levels': Level.objects.filter(on_top_of__isnull=True),
@ -66,7 +66,7 @@ def level_detail(request, pk):
@sidebar_view
def space_detail(request, level, pk):
space = get_object_or_404(Space, level__id=level, pk=pk)
space = get_object_or_404(Space.objects.select_related('level'), level__id=level, pk=pk)
return render(request, 'editor/space.html', {
'level': space.level,
@ -87,11 +87,14 @@ def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, e
if pk is not None:
# Edit existing map item
kwargs = {'pk': pk}
qs = model.objects.all()
if level is not None:
kwargs.update({'level__id': level})
qs = qs.select_related('level')
elif space is not None:
kwargs.update({'space__id': space})
obj = get_object_or_404(model, **kwargs)
qs = qs.select_related('space')
obj = get_object_or_404(qs, **kwargs)
if False: # todo can access
raise PermissionDenied
elif level is not None:
@ -268,7 +271,7 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals
})
elif space is not None:
reverse_kwargs['space'] = space
space = get_object_or_404(Space, pk=space)
space = get_object_or_404(Space.objects.select_related('level'), pk=space)
queryset = queryset.filter(space=space)
ctx.update({
'level': space.level,

View file

@ -29,12 +29,12 @@ class Level(SpecificLocation, EditorFormMixin, models.Model):
super().__init__(*args, **kwargs)
def lower(self):
if self.on_top_of is not None:
if self.on_top_of_id is not None:
raise TypeError
return Level.objects.filter(altitude__lt=self.altitude, on_top_of__isnull=True).order_by('-altitude')
def higher(self):
if self.on_top_of is not None:
if self.on_top_of_id is not None:
raise TypeError
return Level.objects.filter(altitude__gt=self.altitude, on_top_of__isnull=True).order_by('altitude')