Django Ограничение внешних ключей для нескольких вложенных объектов

Начнем с моделей:

class Brand(models.Model):
    id = models.UUIDField(primary_key=True
    name = models.CharField(max_length=255)

class ProductLine(models.Model):
    id = models.UUIDField(primary_key=True
    name = models.CharField(max_length=255)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)

class Product(models.Model):
    id = models.UUIDField(primary_key=True
    name = models.CharField(max_length=255)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    product_line = models.ForeignKey(ProductLine, on_delete=models.CASCADE, blank=True, null=True)

Итак, у нас есть бренды. Бренды могут иметь 0 или более товарных_линий. Продукт всегда имеет бренд, а также может находиться в пределах продуктовой_линии.

Моя цель состоит в том, чтобы ограничить строку_продукта продукта, чтобы она также имела тот же бренд, что и сам продукт.

Например:

  • Бренд A имеет 2 линии продуктов: Премиум, Стандарт
  • Бренд B имеет 1 линейку продуктов: Platinum

Предположим, у нас есть продукт, принадлежащий бренду B. Я хочу, чтобы строка_продукта была либо нулевой, либо Platinum, но не одной из строк_продукта, принадлежащих бренду A (Premium или Standard)

Я не уверен, как этого добиться, или даже должно ли это происходить в сериализаторах, на уровне модели или где-то еще. Любая помощь от опытных django-еров будет очень признательна!

Я не тестировал много в деталях, но я чувствую, что это может работать

class Product(models.Model):
    name = models.CharField(max_length=255)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    product_line = models.ForeignKey(ProductLine, on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        return self.name

    def clean(self):
        if Product.objects.filter(product_line=self.product_line).exists():
            raise ValidationError({'product_line': 'this product line is already selected'})
Вернуться на верх