Django - 禁用相关集中的重复项
Django - disable duplicates in related set
有classOrder
、SubOrder
和classProduct
。我想确保没有 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
对象拥有多个具有相同 Product
的 SubOrders
。
例如 Order[Suborder[A,12],Suborder[B,12],Suborder[B,5]]
应该加注 ValidationError
因为有两个 SubOrders
具有相同的 Product
B.
是否可以在 model
或 database
图层上执行此操作?
编辑
我试过这个:
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 管理中创建这样的订单。
订单和产品的唯一约束阻止为同一订单和同一产品保存多个子订单:
class SubOrder(models.Model):
class Meta:
unique_together = ('order', 'product',)
有classOrder
、SubOrder
和classProduct
。我想确保没有 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
对象拥有多个具有相同 Product
的 SubOrders
。
例如 Order[Suborder[A,12],Suborder[B,12],Suborder[B,5]]
应该加注 ValidationError
因为有两个 SubOrders
具有相同的 Product
B.
是否可以在 model
或 database
图层上执行此操作?
编辑
我试过这个:
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 管理中创建这样的订单。
订单和产品的唯一约束阻止为同一订单和同一产品保存多个子订单:
class SubOrder(models.Model):
class Meta:
unique_together = ('order', 'product',)