Найти - Пользователи
Полная версия: Вопрос - как сделать составной первичный ключ у модели?
Начало » Django » Вопрос - как сделать составной первичный ключ у модели?
1
vvp91
Известно, что django по умолчанию сама определяет поле ID типа целое для модели и назначает это поле первичным ключом. Известно, что можно полностью переопределить поле первичного ключа, включая тип, название, имя поля в БД.
Меня интересует следующее: как можно для модели задать составной первичный ключ - состоящий из нескольких аттрибутов (полей) модели?
Пример:
from django.db import Models

class Item(models.Model):
title = models.CharField(max_length=50)

class Catalog(models.Model):
title = models.CharField(max_length=50)

class ItemCatalog(models.Model):
item = model.ForeignKey(Item)
catalog = model.ForeignKey(Catalog)
Хочу, чтобы модель ItemCatalog при отображении в БД не имела поля ID!
Добавить primary_key=True в оба атрибута не выйдет, поскольку django добавит в SQL DDL фразу PRIMARY KEY в обе колонки разом, а это запрещено SQL DDL:
CREATE TABLE `test_itemcatalog` (
`item_id` integer NOT NULL PRIMARY KEY,
`catalog_id` integer NOT NULL PRIMARY KEY
)
Хочу, чтобы получилось так:
CREATE TABLE `test_itemcatalog` (
`item_id` integer NOT NULL,
`catalog_id` integer NOT NULL,
PRIMARY KEY(`item_id`, `catalog_id`)
)
Александр Кошелев
vvp91
как можно для модели задать составной первичный ключ - состоящий из нескольких аттрибутов (полей) модели?
Никак. Джанга не поддерживает (пока) композитные первичные ключи.

Используйте суррогатный, чем он вам мешает?
vvp91
Daevaorn
vvp91
как можно для модели задать составной первичный ключ - состоящий из нескольких аттрибутов (полей) модели?
Никак. Джанга не поддерживает (пока) композитные первичные ключи.
Используйте суррогатный, чем он вам мешает?
ОК.
Но хотелось бы иметь возможность максимально близкого к структуре БД описания атрибутов сущностей в моделях django.
Поэтому:
1) можно ли обеспечить описание в модели альтернативного ключа по двум и более полям? (UNIQUE (item_id, catalog_id))
2) можно ли вообще запретить django создавать первичный ключ по модели?
Если можно 1) или 2), то как это сделать?
vvp91
vvp91
Daevaorn
Никак. Джанга не поддерживает (пока) композитные первичные ключи.
Используйте суррогатный, чем он вам мешает?
ОК.
Но хотелось бы иметь возможность максимально близкого к структуре БД описания атрибутов сущностей в моделях django.
Поэтому:
1) можно ли обеспечить описание в модели альтернативного ключа по двум и более полям? (UNIQUE (item_id, catalog_id))
2) можно ли вообще запретить django создавать первичный ключ по модели?
Если можно 1) или 2), то как это сделать?
С пунктом 1 понятно:
class ItemCatalog...
...
class Meta
unique_together = (('item', 'catalog'),)
Александр Кошелев
vvp91
2) можно ли вообще запретить django создавать первичный ключ по модели?
нет
Александр Кошелев
vvp91
Но хотелось бы иметь возможность максимально близкого к структуре БД описания атрибутов сущностей в моделях django.
А вообще у вас не правильный подход к проектированию. Если это не легаси система, то гораздо оптимальные исходить из объектной модели и оперировать её сущностями, чем зацикливать на схеме БД до таких деталей. БД - это тупое хранилище данных.
vvp91
Daevaorn
А вообще у вас не правильный подход к проектированию. Если это не легаси система, то гораздо оптимальные исходить из объектной модели и оперировать её сущностями, чем зацикливать на схеме БД до таких деталей. БД - это тупое хранилище данных.
Уважаемый Daevaorn, позвольте мне самому судить о правильности моего подхода к проектированию.
За уточнение того, что django не позволяет отказаться от первичного ключа - спасибо.
Александр Кошелев
vvp91
Уважаемый Daevaorn, позвольте мне самому судить о правильности моего подхода к проектированию.
Конечно, конечно. Лишь хотел дать бесплатный совет, чтобы упростить вам укрощение Джанги.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB