|
11 | 11 |
|
12 | 12 | from celery_once import AlreadyQueued |
13 | 13 | from django.db import transaction |
14 | | -from django.db.models import QuerySet |
| 14 | +from django.db.models import QuerySet, Count |
15 | 15 | from drf_yasg import openapi |
16 | 16 | from rest_framework import serializers |
17 | 17 |
|
@@ -291,7 +291,7 @@ def batch_delete(self, instance: Dict, with_valid=True): |
291 | 291 | self.is_valid(raise_exception=True) |
292 | 292 | paragraph_id_list = instance.get("id_list") |
293 | 293 | QuerySet(Paragraph).filter(id__in=paragraph_id_list).delete() |
294 | | - QuerySet(ProblemParagraphMapping).filter(paragraph_id__in=paragraph_id_list).delete() |
| 294 | + delete_problems_and_mappings(paragraph_id_list) |
295 | 295 | update_document_char_length(self.data.get('document_id')) |
296 | 296 | # 删除向量库 |
297 | 297 | delete_embedding_by_paragraph_ids(paragraph_id_list) |
@@ -541,14 +541,7 @@ def delete(self, with_valid=False): |
541 | 541 | self.is_valid(raise_exception=True) |
542 | 542 | paragraph_id = self.data.get('paragraph_id') |
543 | 543 | Paragraph.objects.filter(id=paragraph_id).delete() |
544 | | - |
545 | | - problem_id = ProblemParagraphMapping.objects.filter(paragraph_id=paragraph_id).values_list('problem_id', |
546 | | - flat=True).first() |
547 | | - |
548 | | - if problem_id is not None: |
549 | | - if ProblemParagraphMapping.objects.filter(problem_id=problem_id).count() == 1: |
550 | | - Problem.objects.filter(id=problem_id).delete() |
551 | | - ProblemParagraphMapping.objects.filter(paragraph_id=paragraph_id).delete() |
| 544 | + delete_problems_and_mappings([paragraph_id]) |
552 | 545 |
|
553 | 546 | update_document_char_length(self.data.get('document_id')) |
554 | 547 | delete_embedding_by_paragraph(paragraph_id) |
@@ -755,3 +748,19 @@ def batch_generate_related(self, instance: Dict, with_valid=True): |
755 | 748 | prompt) |
756 | 749 | except AlreadyQueued as e: |
757 | 750 | raise AppApiException(500, "任务正在执行中,请勿重复下发") |
| 751 | + |
| 752 | + |
| 753 | +def delete_problems_and_mappings(paragraph_ids): |
| 754 | + problem_ids = list( |
| 755 | + ProblemParagraphMapping.objects.filter(paragraph_id__in=paragraph_ids).values_list('problem_id', flat=True)) |
| 756 | + |
| 757 | + if problem_ids: |
| 758 | + ProblemParagraphMapping.objects.filter(paragraph_id__in=paragraph_ids).delete() |
| 759 | + remaining_problem_counts = ProblemParagraphMapping.objects.filter(problem_id__in=problem_ids).values( |
| 760 | + 'problem_id').annotate(count=Count('problem_id')) |
| 761 | + |
| 762 | + problem_ids_to_delete = [pid for pid in problem_ids if |
| 763 | + not any(pc['problem_id'] == pid for pc in remaining_problem_counts)] |
| 764 | + Problem.objects.filter(id__in=problem_ids_to_delete).delete() |
| 765 | + else: |
| 766 | + ProblemParagraphMapping.objects.filter(paragraph_id__in=paragraph_ids).delete() |
0 commit comments