Django - отключить дубликаты в связанном наборе - PullRequest
0 голосов
/ 03 марта 2019

Есть класс Order, SubOrder и класс 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 .

Возможно ли это сделать на model или database layer?

EDIT

Я пробовал это:

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.

1 Ответ

0 голосов
/ 03 марта 2019

Уникальное ограничение для заказа и продукта не позволяет сохранить более одного подзаказа для одного и того же заказа и одного и того же продукта:

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