Я пытаюсь добавить аннотацию к QuerySet, которая имеет значение True / False, когда значение поля в одном связанном объекте меньше, чем значение поля в другом связанном объекте.
ЗдесьВот некоторые модели для примера:
class RobotManager(models.Manager):
queryset = super(RobotManager, self).get_queryset()
queryset = queryset.annotate(canteen_empty=UNKNOWN CODE)
return queryset
class Robot(models.Model):
# Has some other unrelated stuff
objects = RobotManager()
class CanteenLevel(models.Model):
time = models.DateTimeField()
robot = models.ForeignKey("SomeApp.Robot")
gallons = models.IntegerField()
class RobotConfiguration(models.Model):
time = models.DateTimeField()
robot = models.ForeignKey("SomeApp.Robot")
canteen_empty_level = models.IntegerField()
С помощью вышеуказанных моделей, как изменение конфигурации робота или CanteenLevel, мы создаем новые записи и сохраняем исторические данные.
Что я хотел бы сделать, так это добавить аннотацию к роботу QuerySet, в которой будет указано, считается ли столовая робота пустой (последний CanteenLevel.gallons робота меньше, чем последний Configuration.canteen_empty_level робота).
Цель состоит в том, чтобы учесть подобное утверждение, используя аннотацию в QuerySet:
bad_robots = Robot.objects.filter(canteen_empty=True)
Я пытался что-то подобное в аннотации:
canteen_empty=ExpressionWrapper(CanteenLevel.objects.filter(robot=OuterRef('pk')).order_by('-time').values('gallons')[:1] <= RobotConfiguration.objects.filter(robot=OuterRef('robot')).order_by('-time').values('canteen_empty_level')[:1], output_field=models.BooleanField))
Но, очевидно,Оператор "<=" не разрешен. </p>
Я также пробовал это:
canteen_empty=Exists(CanteenLevel.objects.filter(robot=OuterRef('pk')).order_by('-time').values('gallons')[:1].filter(gallons__lte=Subquery(RobotConfiguration.objects.filter(robot=OuterRef('robot')).order_by('-time').values('canteen_empty_level')[:1]))))
Но вы не можете фильтровать после взятия части QuerySet.
Любая помощь будет оценена!