gpt4 book ai didi

python - 如何检查 Django 模型的两个实例在一组属性中是否相同并相应地注释查询集?

转载 作者:行者123 更新时间:2023-12-01 07:37:56 25 4
gpt4 key购买 nike

我的应用程序有一个模型“OptimizationResult”,我在其中存储数学优化的结果。优化在项目之间分配时隙。我需要根据一组属性(特别是不是主键)来指示当前结果是否与最近的结果不同

属性 optimization_run 是不同运行的计数器项目是项目的外键。

通过覆盖模型上的 __hash____eq__ 函数,我可以通过

比较不同的实例
OptimizationResults.objects.filter(proj = 1).filter(optimization_run =1).first() == OptimizationResults.objects.filter(proj = 1).filter(optimization_run = 2).first()

。但据我了解 __eq____hash__ 在数据库上不可用。

我如何相应地注释结果?类似的东西

OptimizationResults.objects.filter(optimization_run = 2).annotate(same_as_before = Case(When(),default=False))

编辑在代码中添加了.first(),以确保只有一个元素。

class OptimizationResult(models.Model):
project = models.ForeignKey(project, on_delete=models.CASCADE)
request_weight = models.IntegerField()
periods_to_plan = models.IntegerField()
unscheduled_periods = models.IntegerField()
scheduled_periods = models.IntegerField()
start = models.DateField(null=True, blank=True, default=None)
end = models.DateField(null=True, blank=True, default=None)
pub_date = models.DateTimeField('Erstellungsdatum', auto_now_add=True, editable=False)
optimization_run= models.ForeignKey(OptimizationRun, on_delete=models.CASCADE)

我想根据开始结束来组合不同的条目。

编辑2

我对子查询的无果尝试:

old = OptimizationResult.objects.filter(project=OuterRef('pk')).filter(optimization_run=19)
newest = OptimizationResult.objects.filter(project=OuterRef('pk')).filter(optimization_run=21)
Project.objects.annotate(changed = Subquery(newest.values('start')[:1])== Subquery(old.values('start')[:1]))

导致类型错误:QuerySet.annotate() 收到非表达式:False

最佳答案

我们可以在这里使用子查询来进行注释:

from django.db.models import Exists, OuterRef, Subquery, Q

to_exclude = {'pk', 'id', 'project', 'project_id', 'optimization_run', 'optimization_run_id'}

subquery = OptimizationResult.objects.filter(
project_id=OuterRef('project_id')
optimization_run=1,
**{f.name: OuterRef(f.name)
for f in OptimizationResult._meta.get_fields()
if f.name not in to_exclude
}
)

OptimizationResult.objects.filter(
optimization_run=2
).annotate(
<b>are_same=Exist(subquery)</b>
)

在这里,我们将使用 optimization_run=2 注释所有 OptimizationResult,并使用额外的属性 .are_same 检查是否存在optimization_run=1相同 project_idOptimizationResult 对象,其中所有字段都相同,除了to_exclude 集中的那些。

关于python - 如何检查 Django 模型的两个实例在一组属性中是否相同并相应地注释查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56885018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com