После добавления ограничения unique_together конфликтуют существующие данные
У меня есть модель:
class Product(BaseModel):
name=models.CharField(max_length=255)
shop = models.ForeignKey('shop.Shop', models.CASCADE, 'products')
И есть существующие данные. Теперь я хочу, чтобы один магазин не мог включать продукты, названия которых одинаковы, используя unique_together:
class Product(BaseModel):
name=models.CharField(max_length=255)
shop = models.ForeignKey('shop.Shop', models.CASCADE, 'products')
class Meta:
unique_together = ['name', 'shop']
Это идеально для новой базы данных, но для существующей базы данных дублирование имен является проблемой.
Как игнорировать или исключить существующие данные? Как применить unique_together к входящим товарам?
Я вижу здесь два разных подхода:
Очистите данные, а затем выполните миграцию с ограничением
.unique_togetherОставить текущие данные и добавить проверку перед сохранением новых экземпляров продукта
Из вашего описания я понял, что вы выступаете за второй подход. Вот пример кода, который вы можете использовать для этой цели:
from django.core.exceptions import ValidationError
class Product(BaseModel):
...
def clean(self):
if Product.objects.filter(name=self.name, shop=self.shop).exists():
raise ValidationError('A product with this name already exists in this shop')
super().clean()
Вот официальная docs с более подробной информацией о том, как переопределить метод clean() в классе модели.
Если вы заинтересованы в реализации первого подхода, я предлагаю очистить данные с помощью пользовательской миграции непосредственно перед внедрением unique_together или выполнить ручную проверку БД, если вам нужно проверить дубликаты по одному.