После рефакторинга
This commit is contained in:
@@ -236,17 +236,40 @@ class SourceListView(LoginRequiredMixin, View):
|
||||
|
||||
# Get all Source objects with query optimization
|
||||
# Using annotate to count ObjItems efficiently (single query with GROUP BY)
|
||||
# Using prefetch_related for reverse ForeignKey relationships to avoid N+1 queries
|
||||
# Using select_related for ForeignKey/OneToOne relationships to avoid N+1 queries
|
||||
# Using prefetch_related for reverse ForeignKey and ManyToMany relationships
|
||||
sources = Source.objects.select_related(
|
||||
'info'
|
||||
'info', # ForeignKey to ObjectInfo
|
||||
'created_by', # ForeignKey to CustomUser
|
||||
'created_by__user', # OneToOne to User
|
||||
'updated_by', # ForeignKey to CustomUser
|
||||
'updated_by__user', # OneToOne to User
|
||||
).prefetch_related(
|
||||
# Prefetch related objitems with their nested relationships
|
||||
'source_objitems',
|
||||
'source_objitems__parameter_obj',
|
||||
'source_objitems__parameter_obj__id_satellite',
|
||||
'source_objitems__parameter_obj__polarization',
|
||||
'source_objitems__parameter_obj__modulation',
|
||||
'source_objitems__parameter_obj__standard',
|
||||
'source_objitems__geo_obj',
|
||||
'source_objitems__geo_obj__mirrors',
|
||||
'source_objitems__lyngsat_source',
|
||||
'source_objitems__lyngsat_source__id_satellite',
|
||||
'source_objitems__lyngsat_source__polarization',
|
||||
'source_objitems__lyngsat_source__modulation',
|
||||
'source_objitems__lyngsat_source__standard',
|
||||
'source_objitems__transponder',
|
||||
'source_objitems__created_by',
|
||||
'source_objitems__created_by__user',
|
||||
'source_objitems__updated_by',
|
||||
'source_objitems__updated_by__user',
|
||||
# Prefetch marks with their relationships
|
||||
'marks',
|
||||
'marks__created_by',
|
||||
'marks__created_by__user'
|
||||
).annotate(
|
||||
# Use annotate for efficient counting in a single query
|
||||
objitem_count=Count('source_objitems', filter=objitem_filter_q, distinct=True) if has_objitem_filter else Count('source_objitems')
|
||||
)
|
||||
|
||||
@@ -704,7 +727,7 @@ class AdminModeratorMixin(UserPassesTestMixin):
|
||||
|
||||
def handle_no_permission(self):
|
||||
messages.error(self.request, 'У вас нет прав для выполнения этого действия.')
|
||||
return redirect('mainapp:home')
|
||||
return redirect('mainapp:source_list')
|
||||
|
||||
|
||||
class SourceUpdateView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
@@ -801,8 +824,8 @@ class SourceDeleteView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
|
||||
# Redirect to source list
|
||||
if request.GET.urlencode():
|
||||
return redirect(f"{reverse('mainapp:home')}?{request.GET.urlencode()}")
|
||||
return redirect('mainapp:home')
|
||||
return redirect(f"{reverse('mainapp:source_list')}?{request.GET.urlencode()}")
|
||||
return redirect('mainapp:source_list')
|
||||
|
||||
|
||||
class DeleteSelectedSourcesView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
@@ -813,7 +836,7 @@ class DeleteSelectedSourcesView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
ids = request.GET.get("ids", "")
|
||||
if not ids:
|
||||
messages.error(request, "Не выбраны источники для удаления")
|
||||
return redirect('mainapp:home')
|
||||
return redirect('mainapp:source_list')
|
||||
|
||||
try:
|
||||
id_list = [int(x) for x in ids.split(",") if x.isdigit()]
|
||||
@@ -858,7 +881,7 @@ class DeleteSelectedSourcesView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
|
||||
except Exception as e:
|
||||
messages.error(request, f'Ошибка при подготовке удаления: {str(e)}')
|
||||
return redirect('mainapp:home')
|
||||
return redirect('mainapp:source_list')
|
||||
|
||||
def post(self, request):
|
||||
"""Actually delete the selected sources."""
|
||||
|
||||
Reference in New Issue
Block a user