Составной первичный ключ в 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