Составной первичный ключ в Django и unique_together

У меня есть база данных, в которой есть таблица order_details с составным первичным ключом из двух полей: order и product. Таким образом, один заказ может иметь много order_details, другими словами: один продукт может иметь много продуктов, связанных с ним. Когда я добавляю новые записи в базу данных, все работает нормально. В своем проекте я использую автогенерируемые модели Django, основанные на схеме базы данных. Проблема в том, что эта конкретная модель OrderDetails, похоже, не работает так, как задумано. Она не позволяет мне добавлять новые OrderDetails для заказа после того, как я добавил первый. Она говорит

Детали заказа с этим заказом уже существуют.

Мне интересно, как правильно написать модель для реализации моего замысла. Я пытался заменить unique_together на models.UniqueConstraint, но это не помогло. Я думаю, что все дело в том, что поле order должно быть OneToOne, поправьте меня, если это не так. Вот SQL скрипт создания и models.

CREATE TABLE IF NOT EXISTS public.order_details
(
    order_id smallint NOT NULL,
    product_id smallint NOT NULL,
    unit_price real NOT NULL,
    quantity smallint NOT NULL,
    discount real NOT NULL,
    CONSTRAINT pk_order_details PRIMARY KEY (order_id, product_id),
    CONSTRAINT fk_order_details_orders FOREIGN KEY (order_id)
        REFERENCES public.orders (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fk_order_details_products FOREIGN KEY (product_id)
        REFERENCES public.products (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

class OrderDetails(models.Model):
    order = models.OneToOneField('Orders', models.DO_NOTHING)
    product = models.ForeignKey('products.Products', models.DO_NOTHING)
    unit_price = models.FloatField()
    quantity = models.SmallIntegerField()
    discount = models.FloatField()

    class Meta:
        managed = False
        db_table = 'order_details'
        constraints = [
            models.UniqueConstraint(fields=['order', 'product'], name='order-product')
        ]
        #unique_together = (('order', 'product'),)

    def get_absolute_url(self):
        return u'/orders/%d' % self.order.pk
Вернуться на верх