Django-禁用相关集中的重复项

时间:2019-03-03 13:51:37

标签: python django django-models django-2.1

有一个类OrderSubOrder和类Product。我想确保没有一个Order对象包含同一对象SubOrder的多个Product对象。

class Order(TimeStampedModel):
    ....

class SubOrder(models.Model):
    order = models.ForeignKey('orders.Order', on_delete=models.CASCADE, related_name='suborders')
    product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(verbose_name='Počet')

因此,如果有3种产品- A,B,C

我不想允许一个Order对象具有多个SubOrders和相同的Product。 例如,Order[Suborder[A,12],Suborder[B,12],Suborder[B,5]]应该提高ValidationError,因为有两个SubOrders具有相同的Product B

是否可以在modeldatabase层上做到这一点?

编辑

我尝试过:

def clean(self):
    neighbour_suborders = self.order.suborders.filter(product=self.product)
    if self.pk:
        neighbour_suborders = neighbour_suborders.exclude(pk=self.pk)
    if neighbour_suborders.exists():
        raise ValidationError("Takýto produkt už v objednávke existuje!")

但是它允许在Django admin中创建这样的命令。

1 个答案:

答案 0 :(得分:1)

订单和产品的唯一约束可防止为同一订单和同一产品保存多个子订单:

class SubOrder(models.Model):
    class Meta:
        unique_together = ('order', 'product',)