我想在 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
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 查询集中。