Доступ к полям базовых классов внешнего ключа в UniqueConstraint

В UniqueConstraint для языка personality -> я получаю ошибку FieldDoesNotExist

Например, если бы мой код выглядел так:

class LanguageModel(models.Model):
    language = models.CharField(
        max_length=16,
        default="en",
    )

    class Meta:
        abstract = True

class PersonModel(LanguageModel):
    created_at = models.DateTimeField(editable=False, auto_now_add=True)
    updated_at = models.DateTimeField(editable=False, auto_now=True)

    class Meta:
        managed = True
        db_table = "PersonModel"

class CollectionofPeople(models.Model):
    id = models.UUIDField(primary_key="True", default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(editable=False, auto_now_add=True)
    updated_at = models.DateTimeField(editable=False, auto_now=True)

    is_default = models.BooleanField(default=False)

    personality = models.ForeignKey(
        "PersonModel",
        null=True,
        on_delete=models.CASCADE,
    )

    class Meta:
        managed = True
        db_table = "CollectionofThings"
        constraints = [
            models.UniqueConstraint(
                fields=["personality__language", "id"],
                name="unique_personality_language",
            )
        ]

Можно ли получить доступ к языку личности в UniqueConstraint? Или, в более общем случае, могу ли я получить доступ к полю абстрактного базового класса внешнего ключа?

более безопасным подходом является обеспечение уникальности в методе clean() перед сохранением

from django.core.exceptions import ValidationError

class CollectionofPeople(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=32)
    created_at = models.DateTimeField(editable=False, auto_now_add=True)
    updated_at = models.DateTimeField(editable=False, auto_now=True)
    is_default = models.BooleanField(default=False)

    personality = models.ForeignKey("PersonModel", null=True, on_delete=models.CASCADE)

    def clean(self):
        if CollectionofPeople.objects.filter(
            personality__language=self.personality.language,
            name=self.name,
        ).exclude(id=self.id).exists():
            raise ValidationError("A collection with this personality language and name already exists!!!!")

    def save(self, *args, **kwargs):
        self.clean()  # here you are validating before saving 
        super().save(*args, **kwargs)
Вернуться на верх