Уникальность вместе в моделях

У меня есть модель под названием 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)
Вернуться на верх