是否可以注释包含查询集的列?

问题描述 投票:0回答:1

我想在 HTML 模板上显示一个表格,其中包含来自 GroupCaseFile 模型的数据。但其中一列必须包含来自最新 ProceduralAct 对象的数据,特别是:“act_number”、“act_type”和“act_summary”(在 HTML 表格的单个单元格内)。

我可以简单地使用这样的东西来得到它:

group_case_file.case_file.proceduralact_set.all().order_by('-created_at').first()

但是,在获取最后一个 ProceduralAct 之前,我想按搜索词应用过滤。搜索词应涵盖相应的最后一个 ProceduralAct 中的“act_number”、“act_type”和“act_summary”。

为了能够执行此搜索,我尝试使用嵌套子查询,就像我在下面的代码中使用“摘要”所做的那样,在 GroupCaseFile 查询中注释“摘要”值,然后才按搜索词应用过滤。我认为如果我只想搜索“摘要”,这就足够了。

但是我想知道是否有任何方法可以注释列,比如说

last_procedural_act
,它可以包含相应的最新 ProceduralAct 行的 QuerySet。这样,我就可以对该 ProceduralAct 行的所有字段执行搜索

如果有不同的方法,我将不胜感激。

型号

class CaseFile(models.Model):

    code = models.CharField(primary_key=True, max_length=30)
    # More fields

class GroupCaseFile(models.Model):

    id = models.BigAutoField(primary_key=True)
    case_file = models.ForeignKey(
        CaseFile, on_delete=models.CASCADE, default=None)
    group = models.ForeignKey('accounts.Group', on_delete=models.CASCADE)
    client_name = models.CharField(max_length=255, null=True, blank=True)
    # More fields

class ProceduralAct(models.Model):

   id = models.BigAutoField(primary_key=True)
   case_file = models.ForeignKey(
       CaseFile, on_delete=models.CASCADE, default=None)
   act_type = models.CharField(max_length=255)
   act_number = models.CharField(max_length=255, null=True)
   summary = models.TextField()
   created_at = models.DateField()

部分景观

# A subquery to retrieve the summary of the latest procedural act
subquery_procedural_acts_summary = Subquery(
    ProceduralAct.objects.filter(
        casefile=OuterRef('pk')
    ).order_by('-created_at').values('summary')[:1]
)

# A subquery to retrieve the last procedural act with its summary
subquery_case_file_last_procedural_act_summary = Subquery(
    CaseFile.objects.annotate(
        last_procedural_act_summary=subquery_procedural_acts_summary
    ).filter(
        groupcasefile=OuterRef('pk')
    ).values('last_procedural_act_summary')
)

# Add columns with data from each data of the last procedural act
group_case_files = GroupCaseFile.objects.annotate(
    last_procedural_act_summary=subquery_case_file_last_procedural_act_summary
) # Do filtering by search terms

dashboard_case_files_list = []
for group_case_file in group_case_files:
   # Collect data to send it as context
django django-queryset
1个回答
0
投票
from django.db.models import Subquery, OuterRef

# Subquery to get the latest procedural act for each case file
latest_procedural_act_subquery = ProceduralAct.objects.filter(
    case_file=OuterRef('case_file')
).order_by('-created_at').values('act_number', 'act_type', 'summary')[:1]

# Annotate the GroupCaseFile queryset with the latest procedural act info
group_case_files = GroupCaseFile.objects.annotate(
    latest_procedural_act_number=Subquery(latest_procedural_act_subquery.values('act_number')),
    latest_procedural_act_type=Subquery(latest_procedural_act_subquery.values('act_type')),
    latest_procedural_act_summary=Subquery(latest_procedural_act_subquery.values('summary'))
)

# Now you can filter based on search terms (replace 'your_search_term' with the actual search term)
filtered_group_case_files = group_case_files.filter(
    latest_procedural_act_number__contains='your_search_term'
    | latest_procedural_act_type__contains='your_search_term'
    | latest_procedural_act_summary__contains='your_search_term'
)

# Collect data to send it as context
dashboard_case_files_list = list(filtered_group_case_files)

在此示例中,

latest_procedural_act_subquery
获取每个 case_file 的 act_number、act_type 和最新程序行为的摘要。然后,这些字段通过注释部分包含在 GroupCaseFile 查询集中。

© www.soinside.com 2019 - 2024. All rights reserved.