To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints.

Let's denote:
- $x$ as the number of laptops sold,
- $y$ as the number of desktops sold.

The profit per laptop is $210, and the profit per desktop is $160. Therefore, the total profit can be represented by the equation $210x + 160y$.

The constraints are as follows:
1. The store can spend at most $20,000 on computers. Given that each laptop costs $500 and each desktop costs $400, this constraint can be written as $500x + 400y \leq 20000$.
2. At least 20 laptops but at most 35 are sold each month: $20 \leq x \leq 35$.
3. The number of desktops sold is at most a third of the number of laptops sold: $y \leq \frac{1}{3}x$.

We aim to maximize profit, so our objective function is to maximize $210x + 160y$, subject to these constraints.

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

```python
from gurobipy import *

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

# Define the decision variables
x = m.addVar(lb=20, ub=35, vtype=GRB.INTEGER, name="laptops")
y = m.addVar(vtype=GRB.INTEGER, name="desktops")

# Set the objective function to maximize profit
m.setObjective(210*x + 160*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(500*x + 400*y <= 20000, "Budget_Constraint")
m.addConstr(y <= (1/3)*x, "Desktop_to_Laptop_Ratio")

# Optimize the model
m.optimize()

# Print out the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of laptops to sell: {x.x}")
    print(f"Number of desktops to sell: {y.x}")
    print(f"Maximum profit: ${210*x.x + 160*y.x:.2f}")
else:
    print("No optimal solution found")
```