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'})