от
В моем приложении есть модель «OptimizationResult», где я храню результаты математической оптимизации. Оптимизация распределяет временные интервалы по проектам. Мне нужно указать, отличаются ли текущие результаты от недавних результатов на основе набора атрибутов (в частности, не первичного ключа) Атрибут optimization_run является coutner для разных запусков Проект является иностранным ключом к проекту. Перезаписав функции
__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 Моя бесплодная попытка с Subquery:
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]))

результаты в TypeError: QuerySet.annotate () получили невыражение (я): False              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

1 Ответ

0 голосов
от
Мы можем использовать подзапрос здесь, чтобы сделать аннотацию:
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(
    are_same=Exist(subquery)
)
Здесь мы, таким образом, аннотировать все
OptimizationResult
s с
optimization_run=2
, с дополнительным атрибутом
.are_same
, который проверяет, если существует объект
OptimizationResult
для
optimization_run=1
и того же
project_id
, где все поля являются одинаковыми, за исключением тех, в наборе
to_exclude
.     
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...