ManyToManyField constraints

Django ORM seems not to permit constraints on ManyToManyField.

class Component(ComponentMetaData):
    class Type(models.IntegerChoices):
        Part = 0
        Components = 1

    type = models.IntegerField(
        choices=Type.choices,
    )
    components = models.ManyToManyField(
        "self",
        blank=True,
        null=True,
    )

    def clean(self) -> None:
        if self.type == 0 and self.components:
            raise ValidationError("Parts could not have components.") 
        return super().clean()

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=(
                    Q(type = 0) & 
                    Q(components__isnull = True)
                ) | (
                    Q(type = 1) 
                    # componenets only fields
                ),
                name = "components_enum"
            )
        ]

Migration attempt with the above model results in the error below;

ERRORS:
myapp.Component: (models.E013) 'constraints' refers to a ManyToManyField 'components', but ManyToManyFields are not permitted in 'constraints'.

Does anyone know why this is not permitted and what should one do if one would like to keep a ManyToManyField empty on some condition based on the values of other fields?

Back to Top