【问题标题】:Django Constraining Foreign Keys for multiple nested objectsDjango 约束多个嵌套对象的外键
【发布时间】:2022-01-13 00:15:27
【问题描述】:

让我们从模型开始:

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 个或多个 product_lines。 一个产品总是有一个品牌,也可能在一个产品线中。

我的目标是将产品的 product_line 限制为与产品本身具有相同的品牌。

例如:

  • 品牌 A 有 2 个产品线:Premium、Standard
  • 品牌 B 有 1 个产品线:白金

假设我们有一个属于品牌 B 的产品。我想让 product_line 为 null 或 Platinum,但不允许属于品牌 A(Premium 或 Standard)的 product_line 之一

我不确定如何实现这一点,或者即使这应该发生在序列化程序、模型级别或其他地方。经验丰富的 django-ers 的任何帮助将不胜感激!

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    我没有详细测试过,但我觉得这可能有效

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

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多