| 267 | |
| 268 | |
| 269 | class UniqueConstraint(BaseConstraint): |
| 270 | def __init__( |
| 271 | self, |
| 272 | *expressions, |
| 273 | fields=(), |
| 274 | name, |
| 275 | condition=None, |
| 276 | deferrable=None, |
| 277 | include=None, |
| 278 | opclasses=(), |
| 279 | nulls_distinct=None, |
| 280 | violation_error_code=None, |
| 281 | violation_error_message=None, |
| 282 | ): |
| 283 | if not name: |
| 284 | raise ValueError("A unique constraint must be named.") |
| 285 | if not expressions and not fields: |
| 286 | raise ValueError( |
| 287 | "At least one field or expression is required to define a " |
| 288 | "unique constraint." |
| 289 | ) |
| 290 | if expressions and fields: |
| 291 | raise ValueError( |
| 292 | "UniqueConstraint.fields and expressions are mutually exclusive." |
| 293 | ) |
| 294 | if not isinstance(condition, (NoneType, Q)): |
| 295 | raise ValueError("UniqueConstraint.condition must be a Q instance.") |
| 296 | if condition and deferrable: |
| 297 | raise ValueError("UniqueConstraint with conditions cannot be deferred.") |
| 298 | if include and deferrable: |
| 299 | raise ValueError("UniqueConstraint with include fields cannot be deferred.") |
| 300 | if opclasses and deferrable: |
| 301 | raise ValueError("UniqueConstraint with opclasses cannot be deferred.") |
| 302 | if expressions and deferrable: |
| 303 | raise ValueError("UniqueConstraint with expressions cannot be deferred.") |
| 304 | if expressions and opclasses: |
| 305 | raise ValueError( |
| 306 | "UniqueConstraint.opclasses cannot be used with expressions. " |
| 307 | "Use django.contrib.postgres.indexes.OpClass() instead." |
| 308 | ) |
| 309 | if not isinstance(deferrable, (NoneType, Deferrable)): |
| 310 | raise TypeError( |
| 311 | "UniqueConstraint.deferrable must be a Deferrable instance." |
| 312 | ) |
| 313 | if not isinstance(include, (NoneType, list, tuple)): |
| 314 | raise TypeError("UniqueConstraint.include must be a list or tuple.") |
| 315 | if not isinstance(opclasses, (list, tuple)): |
| 316 | raise TypeError("UniqueConstraint.opclasses must be a list or tuple.") |
| 317 | if not isinstance(nulls_distinct, (NoneType, bool)): |
| 318 | raise TypeError("UniqueConstraint.nulls_distinct must be a bool.") |
| 319 | if opclasses and len(fields) != len(opclasses): |
| 320 | raise ValueError( |
| 321 | "UniqueConstraint.fields and UniqueConstraint.opclasses must " |
| 322 | "have the same number of elements." |
| 323 | ) |
| 324 | self.fields = tuple(fields) |
| 325 | self.condition = condition |
| 326 | self.deferrable = deferrable |
no outgoing calls