Уникальное значение поля модели Django

#python #django

#python #django

Вопрос:

Итак, у меня есть две модели: RetailStore и Product . Продукт содержит внешний ключ для RetailStore и поле с именем sku . По сути, мне нужно убедиться, что sku поле уникально в хранилище, но не между всеми хранилищами, например:

Store1: Product(sku="sku1"), Product(sku="sku2"), Product(sku="sku3"), Product(sku="sku1") <- не может иметь это последнее, потому что оно уже существует.

Store2: Product(sku="sku1"), Product(sku="sku2"), Product(sku="sku3") <- Это нормально

Store3: [...] <- То же самое относится и к другим хранилищам.

Мои модели

 class RetailStore(StandardModelMixin):
    cnpj = models.CharField(
        blank=False, null=False, unique=True, max_length=200, validators=[validate_cnpj], verbose_name="CNPJ"
    )

    [other fields...]

class Product(StandardModelMixin, SoftDeletionModel):
    sku = models.CharField(blank=False, null=False, max_length=200, verbose_name="SKU")
    
    [other fields...]
    
    retail_store = models.ForeignKey(
        RetailStore,
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        related_name="products",
        verbose_name="Retail Store",
    )
  

Ответ №1:

Вы можете использовать UniqueConstraint, чтобы иметь одинаковые артикулы в разных магазинах, но не в одном.

 class Product(StandardModelMixin, SoftDeletionModel):
    ...
    
    class Meta:
        constraints = [models.UniqueConstraint(
            fields=['sku', 'retail_store'], 
            name='unique_sku_in_store'
        )]
  

Комментарии:

1. Просто небольшой совет, модели. UniqueConstraint должен быть итеративным, чтобы исправить, просто оберните его с помощью [constraints = models. UniqueConstraint(…)]. Но это сработало, спасибо!

Ответ №2:

Вам нужно будет применить к этому validate_unique.

Django предлагает unique_together, но он предоставляет уникальность одной модели, а не между моделями.

Документы:https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models .Model.validate_unique