EXPLAIN ANALYZE SELECT * FROM food WHERE food.post_timestamp >= ('now'::date - interval '1 month')::date AND food.post_timestamp <= 'now' ORDER BY food.post_timestamp DESC LIMIT 30;
I think the problem is that you're using 'now'::date in your first example, which gets frozen. You can use now() or current_timestamp or current_date to get dynamic results.
CREATE VIEW test_now AS SELECT current_timestamp as current_ts, now() as now_function,'now'::timestamp AS now_literal;