Доступ к полям базовых классов внешнего ключа в 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)