I agree this feature would be useful, at least to allow bundling check constraints with custom field classes. As you point out the PositiveIntegerField classes do this within Django, and doubtless many custom fields have used the db_check() method.
The only thing I'm not a fan of in your proposal is repeating the field name within the check expression, like "price" in:
price = DecimalField(..., check=Q(price__gte=0))
This seems repetitive at least, and would increase error refactoring. Also Django field classes typically don't “know” their name until the Model meta class logic runs, and contribute_to_class() is called. Requiring the name within check() would mean it would need to accept any name and validate it later.
Perhaps we could support only a special name instead, like “self” or the shorter “f”?
price = DecimalField(..., check=Q(f__gte=0))