To solve Andy's problem (referred to as David in the latter part of the description, but we'll proceed with the problem as stated), we can formulate a linear programming model. The goal is to minimize the total cost of the post-workout drinks while ensuring that the minimum nutritional requirements are met.

Let's define the variables and parameters:
- Let \(x_c\) be the number of bottles of chocolate milk.
- Let \(x_v\) be the number of bottles of vegetable juice.
- The cost per bottle of chocolate milk is $3.5, and the cost per bottle of vegetable juice is $6.
- Chocolate milk contains 6 units of potassium, 4 units of magnesium, and 5 units of calcium per bottle.
- Vegetable juice contains 9 units of potassium, 5 units of magnesium, and 7 units of calcium per bottle.
- The minimum requirements are 20 units of potassium, 8 units of magnesium, and 12 units of calcium.

The objective function to minimize is the total cost: \(3.5x_c + 6x_v\).

The constraints based on the nutritional requirements are:
1. Potassium: \(6x_c + 9x_v \geq 20\)
2. Magnesium: \(4x_c + 5x_v \geq 8\)
3. Calcium: \(5x_c + 7x_v \geq 12\)

Since we cannot buy a negative number of bottles, we also have:
\(x_c \geq 0\) and \(x_v \geq 0\).

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("post_workout_drinks")

# Define the variables
x_c = m.addVar(vtype=GRB.CONTINUOUS, name="chocolate_milk", lb=0)
x_v = m.addVar(vtype=GRB.CONTINUOUS, name="vegetable_juice", lb=0)

# Set the objective function
m.setObjective(3.5*x_c + 6*x_v, GRB.MINIMIZE)

# Add constraints
m.addConstr(6*x_c + 9*x_v >= 20, "potassium")
m.addConstr(4*x_c + 5*x_v >= 8, "magnesium")
m.addConstr(5*x_c + 7*x_v >= 12, "calcium")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Minimum cost: $", m.objVal)
    print("Number of bottles of chocolate milk:", x_c.x)
    print("Number of bottles of vegetable juice:", x_v.x)
else:
    print("The model is infeasible")

```