I don't know if this is better for you, but doing it this way would work:
if (self.months && self.dollars) || (self.months && self.lifetime) || (self.dollars && self.lifetime):
raise ValueError("Coupon can be valid for only one of: months, lifetime, or dollars")