Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Вопрос - как сделать составной первичный ключ у модели? [RSS Feed]

#1 Июль 13, 2009 15:27:17

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

Известно, что 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`)
)



Офлайн

#2 Июль 13, 2009 16:16:17

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

vvp91
как можно для модели задать составной первичный ключ - состоящий из нескольких аттрибутов (полей) модели?
Никак. Джанга не поддерживает (пока) композитные первичные ключи.

Используйте суррогатный, чем он вам мешает?



Офлайн

#3 Июль 13, 2009 16:33:42

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

Daevaorn
vvp91
как можно для модели задать составной первичный ключ - состоящий из нескольких аттрибутов (полей) модели?
Никак. Джанга не поддерживает (пока) композитные первичные ключи.
Используйте суррогатный, чем он вам мешает?
ОК.
Но хотелось бы иметь возможность максимально близкого к структуре БД описания атрибутов сущностей в моделях django.
Поэтому:
1) можно ли обеспечить описание в модели альтернативного ключа по двум и более полям? (UNIQUE (item_id, catalog_id))
2) можно ли вообще запретить django создавать первичный ключ по модели?
Если можно 1) или 2), то как это сделать?



Офлайн

#4 Июль 13, 2009 16:39:04

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

vvp91
Daevaorn
Никак. Джанга не поддерживает (пока) композитные первичные ключи.
Используйте суррогатный, чем он вам мешает?
ОК.
Но хотелось бы иметь возможность максимально близкого к структуре БД описания атрибутов сущностей в моделях django.
Поэтому:
1) можно ли обеспечить описание в модели альтернативного ключа по двум и более полям? (UNIQUE (item_id, catalog_id))
2) можно ли вообще запретить django создавать первичный ключ по модели?
Если можно 1) или 2), то как это сделать?
С пунктом 1 понятно:
class ItemCatalog...
...
class Meta
unique_together = (('item', 'catalog'),)



Офлайн

#5 Июль 13, 2009 16:41:00

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

vvp91
2) можно ли вообще запретить django создавать первичный ключ по модели?
нет



Офлайн

#6 Июль 13, 2009 16:44:57

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

vvp91
Но хотелось бы иметь возможность максимально близкого к структуре БД описания атрибутов сущностей в моделях django.
А вообще у вас не правильный подход к проектированию. Если это не легаси система, то гораздо оптимальные исходить из объектной модели и оперировать её сущностями, чем зацикливать на схеме БД до таких деталей. БД - это тупое хранилище данных.



Офлайн

#7 Июль 13, 2009 16:51:40

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

Daevaorn
А вообще у вас не правильный подход к проектированию. Если это не легаси система, то гораздо оптимальные исходить из объектной модели и оперировать её сущностями, чем зацикливать на схеме БД до таких деталей. БД - это тупое хранилище данных.
Уважаемый Daevaorn, позвольте мне самому судить о правильности моего подхода к проектированию.
За уточнение того, что django не позволяет отказаться от первичного ключа - спасибо.



Офлайн

#8 Июль 13, 2009 18:39:39

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос - как сделать составной первичный ключ у модели?

vvp91
Уважаемый Daevaorn, позвольте мне самому судить о правильности моего подхода к проектированию.
Конечно, конечно. Лишь хотел дать бесплатный совет, чтобы упростить вам укрощение Джанги.



Офлайн

  • Начало
  • » Django
  • » Вопрос - как сделать составной первичный ключ у модели?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version