Как можно убедиться, что значения двух разных полей из разных моделей в Django являются уникальными?

Как можно проверить уникальность значения поля "Имя" в моделях "Организации" и "Пользователи" одновременно, чтобы URL были вида /имя?
  • 23 апреля 2024 г. 8:50
Ответы на вопрос 2
Для того чтобы убедиться, что значения двух разных полей из разных моделей в Django являются уникальными, можно воспользоваться функцией clean(), которая позволяет добавить кастомную логику валидации значений полей перед сохранением записи.

Пример:
```python
from django.core.exceptions import ValidationError

class Model1(models.Model):
    field1 = models.CharField(max_length=100)

class Model2(models.Model):
    field2 = models.CharField(max_length=100)
    
    def clean(self):
        if Model1.objects.filter(field1=self.field2).exists():
            raise ValidationError('Значение поля field2 уже существует в модели Model1')
```

Для проверки уникальности значения поля "Имя" в моделях "Организации" и "Пользователи" одновременно, можно воспользоваться сигналами (signals) Django.

Пример:
```python
from django.core.exceptions import ValidationError
from django.db.models.signals import pre_save
from django.dispatch import receiver

class Organization(models.Model):
    name = models.CharField(max_length=100)

class User(models.Model):
    name = models.CharField(max_length=100)

@receiver(pre_save, sender=Organization)
def check_name_uniqueness(sender, instance, **kwargs):
    if Organization.objects.filter(name=instance.name).exists() or User.objects.filter(name=instance.name).exists():
        raise ValidationError('Значение поля "Имя" уже существует в моделях "Организации" или "Пользователи"')
```

При таком подходе, при попытке сохранить запись с одинаковым значением поля "Имя" в модели "Организации" или "Пользователи" будет выбрасываться ошибка и запись не будет сохранена.
урл будут /имя
Тут скорее всего, правильней делать общую таблицу с полем Имя, и в ней навесить UniqueConstraint, а организации и юзеры уже на нее через OneToOneField ссылаются.
Похожие вопросы