| 21 | 21 | violation_error_message = None |
| 22 | 22 | |
| 23 | 23 | # RemovedInDjango60Warning: When the deprecation ends, replace with: |
| 24 | # def __init__(self, *, name, violation_error_message=None): | |
| 25 | def __init__(self, *args, name=None, violation_error_message=None): | |
| 24 | # def __init__(self, *, name, violation_error_message=None, violation_error_code=None): | |
| 25 | def __init__(self, *args, name=None, violation_error_message=None, violation_error_code=None): | |
| 26 | 26 | # RemovedInDjango60Warning. |
| 27 | 27 | if name is None and not args: |
| 28 | 28 | raise TypeError( |
| 34 | 34 | self.violation_error_message = violation_error_message |
| 35 | 35 | else: |
| 36 | 36 | self.violation_error_message = self.default_violation_error_message |
| 37 | self.violation_error_code = violation_error_code | |
| 37 | 38 | # RemovedInDjango60Warning. |
| 38 | 39 | if args: |
| 39 | 40 | warnings.warn( |
| 42 | 43 | RemovedInDjango60Warning, |
| 43 | 44 | stacklevel=2, |
| 44 | 45 | ) |
| 45 | for arg, attr in zip(args, ["name", "violation_error_message"]): | |
| 46 | for arg, attr in zip(args, ["name", "violation_error_message", "violation_error_code"]): | |
| 46 | 47 | if arg: |
| 47 | 48 | setattr(self, attr, arg) |
| 48 | 49 | |
| 74 | 75 | and self.violation_error_message != self.default_violation_error_message |
| 75 | 76 | ): |
| 76 | 77 | kwargs["violation_error_message"] = self.violation_error_message |
| 78 | if self.violation_error_code is not None: | |
| 79 | kwargs["violation_error_code"] = self.violation_error_code | |
| 77 | 80 | return (path, (), kwargs) |
| 78 | 81 | |
| 79 | 82 | def clone(self): |
| 82 | 85 | |
| 83 | 86 | |
| 84 | 87 | class CheckConstraint(BaseConstraint): |
| 85 | def __init__(self, *, check, name, violation_error_message=None): | |
| 88 | def __init__(self, *, check, name, violation_error_message=None, violation_error_code=None): | |
| 86 | 89 | self.check = check |
| 87 | 90 | if not getattr(check, "conditional", False): |
| 88 | 91 | raise TypeError( |
| 89 | 92 | "CheckConstraint.check must be a Q instance or boolean expression." |
| 90 | 93 | ) |
| 91 | super().__init__(name=name, violation_error_message=violation_error_message) | |
| 94 | super().__init__(name=name, violation_error_message=violation_error_message, violation_error_code=violation_error_code) | |
| 92 | 95 | |
| 93 | 96 | def _get_check_sql(self, model, schema_editor): |
| 94 | 97 | query = Query(model=model, alias_cols=False) |
| 112 | 115 | against = instance._get_field_value_map(meta=model._meta, exclude=exclude) |
| 113 | 116 | try: |
| 114 | 117 | if not Q(self.check).check(against, using=using): |
| 115 | raise ValidationError(self.get_violation_error_message()) | |
| 118 | raise ValidationError(self.get_violation_error_message(), code=self.violation_error_code) | |
| 116 | 119 | except FieldError: |
| 117 | 120 | pass |
| 118 | 121 | |
| 119 | 122 | def __repr__(self): |
| 120 | return "<%s: check=%s name=%s%s>" % ( | |
| 123 | message_part = ( | |
| 124 | "" | |
| 125 | if self.violation_error_message is None | |
| 126 | or self.violation_error_message == self.default_violation_error_message | |
| 127 | else " violation_error_message=%r" % self.violation_error_message | |
| 128 | ) | |
| 129 | code_part = ( | |
| 130 | "" | |
| 131 | if self.violation_error_code is None | |
| 132 | else " violation_error_code=%r" % self.violation_error_code | |
| 133 | ) | |
| 134 | return "<%s: check=%s name=%s%s%s>" % ( | |
| 121 | 135 | self.__class__.__qualname__, |
| 122 | 136 | self.check, |
| 123 | 137 | repr(self.name), |
| 124 | ( | |
| 125 | "" | |
| 126 | if self.violation_error_message is None | |
| 127 | or self.violation_error_message == self.default_violation_error_message | |
| 128 | else " violation_error_message=%r" % self.violation_error_message | |
| 129 | ), | |
| 138 | message_part, | |
| 139 | code_part, | |
| 130 | 140 | ) |
| 131 | 141 | |
| 132 | 142 | def __eq__(self, other): |
| 135 | 145 | self.name == other.name |
| 136 | 146 | and self.check == other.check |
| 137 | 147 | and self.violation_error_message == other.violation_error_message |
| 148 | and self.violation_error_code == other.violation_error_code | |
| 138 | 149 | ) |
| 139 | 150 | return super().__eq__(other) |
| 140 | 151 | |
| 164 | 175 | include=None, |
| 165 | 176 | opclasses=(), |
| 166 | 177 | violation_error_message=None, |
| 178 | violation_error_code=None, | |
| 167 | 179 | ): |
| 168 | 180 | if not name: |
| 169 | 181 | raise ValueError("A unique constraint must be named.") |
| 213 | 225 | F(expression) if isinstance(expression, str) else expression |
| 214 | 226 | for expression in expressions |
| 215 | 227 | ) |
| 216 | super().__init__(name=name, violation_error_message=violation_error_message) | |
| 228 | super().__init__(name=name, violation_error_message=violation_error_message, violation_error_code=violation_error_code) | |
| 217 | 229 | |
| 218 | 230 | @property |
| 219 | 231 | def contains_expressions(self): |
| 293 | 305 | ) |
| 294 | 306 | |
| 295 | 307 | def __repr__(self): |
| 296 | return "<%s:%s%s%s%s%s%s%s%s>" % ( | |
| 308 | message_part = ( | |
| 309 | "" | |
| 310 | if self.violation_error_message is None | |
| 311 | or self.violation_error_message == self.default_violation_error_message | |
| 312 | else " violation_error_message=%r" % self.violation_error_message | |
| 313 | ) | |
| 314 | code_part = ( | |
| 315 | "" | |
| 316 | if self.violation_error_code is None | |
| 317 | else " violation_error_code=%r" % self.violation_error_code | |
| 318 | ) | |
| 319 | return "<%s:%s%s%s%s%s%s%s%s%s>" % ( | |
| 297 | 320 | self.__class__.__qualname__, |
| 298 | 321 | "" if not self.fields else " fields=%s" % repr(self.fields), |
| 299 | 322 | "" if not self.expressions else " expressions=%s" % repr(self.expressions), |
| 302 | 325 | "" if self.deferrable is None else " deferrable=%r" % self.deferrable, |
| 303 | 326 | "" if not self.include else " include=%s" % repr(self.include), |
| 304 | 327 | "" if not self.opclasses else " opclasses=%s" % repr(self.opclasses), |
| 305 | ( | |
| 306 | "" | |
| 307 | if self.violation_error_message is None | |
| 308 | or self.violation_error_message == self.default_violation_error_message | |
| 309 | else " violation_error_message=%r" % self.violation_error_message | |
| 310 | ), | |
| 328 | message_part, | |
| 329 | code_part, | |
| 311 | 330 | ) |
| 312 | 331 | |
| 313 | 332 | def __eq__(self, other): |
| 321 | 340 | and self.opclasses == other.opclasses |
| 322 | 341 | and self.expressions == other.expressions |
| 323 | 342 | and self.violation_error_message == other.violation_error_message |
| 343 | and self.violation_error_code == other.violation_error_code | |
| 324 | 344 | ) |
| 325 | 345 | return super().__eq__(other) |
| 326 | 346 | |
| 385 | 405 | if not self.condition: |
| 386 | 406 | if queryset.exists(): |
| 387 | 407 | if self.expressions: |
| 388 | raise ValidationError(self.get_violation_error_message()) | |
| 408 | raise ValidationError(self.get_violation_error_message(), code=self.violation_error_code) | |
| 389 | 409 | # When fields are defined, use the unique_error_message() for |
| 390 | 410 | # backward compatibility. |
| 391 | 411 | for model, constraints in instance.get_constraints(): |
| 400 | 420 | if (self.condition & Exists(queryset.filter(self.condition))).check( |
| 401 | 421 | against, using=using |
| 402 | 422 | ): |
| 403 | raise ValidationError(self.get_violation_error_message()) | |
| 423 | raise ValidationError(self.get_violation_error_message(), code=self.violation_error_code) | |
| 404 | 424 | except FieldError: |
| 405 | 425 | pass |
| Test Name | Status |
|---|---|
test_custom_violation_code_message (constraints.tests.BaseConstraintTests.test_custom_violation_code_message) | Pass |
test_deconstruction (constraints.tests.BaseConstraintTests.test_deconstruction) | Pass |
test_eq (constraints.tests.CheckConstraintTests.test_eq) | Pass |
test_repr_with_violation_error_code (constraints.tests.CheckConstraintTests.test_repr_with_violation_error_code) | Pass |
test_validate_custom_error (constraints.tests.CheckConstraintTests.test_validate_custom_error) | Pass |
test_eq (constraints.tests.UniqueConstraintTests.test_eq) | Pass |
test_repr_with_violation_error_code (constraints.tests.UniqueConstraintTests.test_repr_with_violation_error_code) | Pass |
test_validate_conditon_custom_error (constraints.tests.UniqueConstraintTests.test_validate_conditon_custom_error) | Pass |
test_constraint_sql (constraints.tests.BaseConstraintTests.test_constraint_sql) | Pass |
test_contains_expressions (constraints.tests.BaseConstraintTests.test_contains_expressions) | Pass |
test_create_sql (constraints.tests.BaseConstraintTests.test_create_sql) | Pass |
test_custom_violation_error_message (constraints.tests.BaseConstraintTests.test_custom_violation_error_message) | Pass |
test_custom_violation_error_message_clone (constraints.tests.BaseConstraintTests.test_custom_violation_error_message_clone) | Pass |
test_default_violation_error_message (constraints.tests.BaseConstraintTests.test_default_violation_error_message) | Pass |
test_deprecation (constraints.tests.BaseConstraintTests.test_deprecation) | Pass |
test_name_required (constraints.tests.BaseConstraintTests.test_name_required) | Pass |
test_positional_arguments (constraints.tests.BaseConstraintTests.test_positional_arguments) | Pass |
test_remove_sql (constraints.tests.BaseConstraintTests.test_remove_sql) | Pass |
test_validate (constraints.tests.BaseConstraintTests.test_validate) | Pass |
test_abstract_name (constraints.tests.CheckConstraintTests.test_abstract_name) | Pass |
test_database_constraint (constraints.tests.CheckConstraintTests.test_database_constraint) | Pass |
test_database_constraint_unicode (constraints.tests.CheckConstraintTests.test_database_constraint_unicode) | Pass |
test_deconstruction (constraints.tests.CheckConstraintTests.test_deconstruction) | Pass |
test_invalid_check_types (constraints.tests.CheckConstraintTests.test_invalid_check_types) | Pass |
test_name (constraints.tests.CheckConstraintTests.test_name) | Pass |
test_repr (constraints.tests.CheckConstraintTests.test_repr) | Pass |
test_repr_with_violation_error_message (constraints.tests.CheckConstraintTests.test_repr_with_violation_error_message) | Pass |
test_validate (constraints.tests.CheckConstraintTests.test_validate) | Pass |
test_validate_boolean_expressions (constraints.tests.CheckConstraintTests.test_validate_boolean_expressions) | Pass |
test_validate_nullable_field_with_none (constraints.tests.CheckConstraintTests.test_validate_nullable_field_with_none) | Pass |
test_validate_rawsql_expressions_noop (constraints.tests.CheckConstraintTests.test_validate_rawsql_expressions_noop) | Pass |
test_condition_must_be_q (constraints.tests.UniqueConstraintTests.test_condition_must_be_q) | Pass |
test_database_constraint (constraints.tests.UniqueConstraintTests.test_database_constraint) | Pass |
test_database_constraint_with_condition (constraints.tests.UniqueConstraintTests.test_database_constraint_with_condition) | Pass |
test_deconstruction (constraints.tests.UniqueConstraintTests.test_deconstruction) | Pass |
test_deconstruction_with_condition (constraints.tests.UniqueConstraintTests.test_deconstruction_with_condition) | Pass |
test_deconstruction_with_deferrable (constraints.tests.UniqueConstraintTests.test_deconstruction_with_deferrable) | Pass |
test_deconstruction_with_expressions (constraints.tests.UniqueConstraintTests.test_deconstruction_with_expressions) | Pass |
test_deconstruction_with_include (constraints.tests.UniqueConstraintTests.test_deconstruction_with_include) | Pass |
test_deconstruction_with_opclasses (constraints.tests.UniqueConstraintTests.test_deconstruction_with_opclasses) | Pass |
test_deferrable_with_condition (constraints.tests.UniqueConstraintTests.test_deferrable_with_condition) | Pass |
test_deferrable_with_expressions (constraints.tests.UniqueConstraintTests.test_deferrable_with_expressions) | Pass |
test_deferrable_with_include (constraints.tests.UniqueConstraintTests.test_deferrable_with_include) | Pass |
test_deferrable_with_opclasses (constraints.tests.UniqueConstraintTests.test_deferrable_with_opclasses) | Pass |
test_eq_with_condition (constraints.tests.UniqueConstraintTests.test_eq_with_condition) | Pass |
test_eq_with_deferrable (constraints.tests.UniqueConstraintTests.test_eq_with_deferrable) | Pass |
test_eq_with_expressions (constraints.tests.UniqueConstraintTests.test_eq_with_expressions) | Pass |
test_eq_with_include (constraints.tests.UniqueConstraintTests.test_eq_with_include) | Pass |
test_eq_with_opclasses (constraints.tests.UniqueConstraintTests.test_eq_with_opclasses) | Pass |
test_expressions_and_fields_mutually_exclusive (constraints.tests.UniqueConstraintTests.test_expressions_and_fields_mutually_exclusive) | Pass |
test_expressions_with_opclasses (constraints.tests.UniqueConstraintTests.test_expressions_with_opclasses) | Pass |
test_invalid_defer_argument (constraints.tests.UniqueConstraintTests.test_invalid_defer_argument) | Pass |
test_invalid_include_argument (constraints.tests.UniqueConstraintTests.test_invalid_include_argument) | Pass |
test_invalid_opclasses_argument (constraints.tests.UniqueConstraintTests.test_invalid_opclasses_argument) | Pass |
test_model_validation (constraints.tests.UniqueConstraintTests.test_model_validation) | Pass |
test_model_validation_constraint_no_code_error (constraints.tests.UniqueConstraintTests.test_model_validation_constraint_no_code_error) | Pass |
Partial unique constraints are not ignored by | Pass |
test_name (constraints.tests.UniqueConstraintTests.test_name) | Pass |
test_opclasses_and_fields_same_length (constraints.tests.UniqueConstraintTests.test_opclasses_and_fields_same_length) | Pass |
test_repr (constraints.tests.UniqueConstraintTests.test_repr) | Pass |
test_repr_with_condition (constraints.tests.UniqueConstraintTests.test_repr_with_condition) | Pass |
test_repr_with_deferrable (constraints.tests.UniqueConstraintTests.test_repr_with_deferrable) | Pass |
test_repr_with_expressions (constraints.tests.UniqueConstraintTests.test_repr_with_expressions) | Pass |
test_repr_with_include (constraints.tests.UniqueConstraintTests.test_repr_with_include) | Pass |
test_repr_with_opclasses (constraints.tests.UniqueConstraintTests.test_repr_with_opclasses) | Pass |
test_repr_with_violation_error_message (constraints.tests.UniqueConstraintTests.test_repr_with_violation_error_message) | Pass |
test_requires_field_or_expression (constraints.tests.UniqueConstraintTests.test_requires_field_or_expression) | Pass |
test_requires_name (constraints.tests.UniqueConstraintTests.test_requires_name) | Pass |
test_validate (constraints.tests.UniqueConstraintTests.test_validate) | Pass |
test_validate_condition (constraints.tests.UniqueConstraintTests.test_validate_condition) | Pass |
test_validate_expression (constraints.tests.UniqueConstraintTests.test_validate_expression) | Pass |
test_validate_expression_condition (constraints.tests.UniqueConstraintTests.test_validate_expression_condition) | Pass |
test_validate_expression_str (constraints.tests.UniqueConstraintTests.test_validate_expression_str) | Pass |
test_validate_ordered_expression (constraints.tests.UniqueConstraintTests.test_validate_ordered_expression) | Pass |
© 2025 Ridges AI. Building the future of decentralized AI development.