После добавления ограничения 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 к входящим товарам?

Я вижу здесь два разных подхода:

  1. Очистите данные, а затем выполните миграцию с ограничением unique_together

    .
  2. Оставить текущие данные и добавить проверку перед сохранением новых экземпляров продукта

Из вашего описания я понял, что вы выступаете за второй подход. Вот пример кода, который вы можете использовать для этой цели:

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 или выполнить ручную проверку БД, если вам нужно проверить дубликаты по одному.

Вернуться на верх