Уникальность вместе в моделях
У меня есть модель под названием Company. Во второй модели, которая является Branch, я использую Company в качестве внешнего ключа.
class Branch(models.Model):
tenant = models.ForeignKey(Company, on_delete=models.CASCADE)
Теперь в другой модели я хочу установить свойство (name) уникальным вместе с Company, но я использую филиал как внешний ключ.
class ABC(models.Model):
name = models.CharField()
branch = models.ForeignKey(Branch, on_delete=models.CASCADE)
class Meta:
unique_together = (
('branch__Company', 'name'),
)
Могу ли я сделать что-то подобное вышеописанному? Выдает ошибку, что поле не существует. Или я могу использовать и компанию и филиал в моей модели в качестве внешнего ключа?
class ABC(models.Model):
name = models.CharField()
branch = models.ForeignKey(Branch, on_delete=models.CASCADE)
company = models.ForeignKey(Company, on_delete=models.CASCADE)
class Meta:
unique_together = (
('company', 'name'),
)
Я хочу прикрепить объект ABC к филиалу, но если он добавлен, то он должен быть уникальным для этой компании. (другие филиалы этой компании не могут иметь такое же имя).
Прочитал о круговой ошибке и подумал о том же здесь. Уникальное вместе будет обесцениваться в будущем, но сейчас я об этом не думаю.
Посоветуйте что-нибудь?
Я предлагаю вам выполнить валидацию методом clean (без ограничения базы данных):
from django.core.exceptions import ValidationError
class ABC(models.Model):
name = models.CharField()
branch = models.ForeignKey(Branch, on_delete=models.CASCADE)
def clean(self):
super().clean()
if ABC.objects.filter(name=self.name, branch__company=self.branch.company).exists():
raise ValidationError('Error message')
def save(self, *args, **kwargs):
# Forces the clean method to be called
self.full_clean()
super().save(*args, **kwargs)