Внешний Ключ Django С Несколькими Столбцами

можно ли определить внешние ключи, ссылающиеся на несколько столбцов в другой модели?

например, один внешний ключ ссылается на индекс из двух столбцов в таблице product и инструкцию SQL:

FOREIGN KEY (product_category, product_id) REFERENCES product(category, id)

кстати, я посмотрел в django.contrib.contenttypes и не думаю, что это идеальное решение для такого сценария.

3 ответов


Она еще не поддерживается. Существует билет и возможные способы его обработки, если вы хотите. может быть, вы даже могли бы бежать пользовательский sql

поддержка нескольких столбцов первичного ключа

в конструкциях реляционных баз данных в качестве первичного ключа таблицы используется набор столбцов. Когда этот набор включает более одного столбца, он известен как "составной" или "составной" первичный ключ. (Для получения дополнительной информации о терминологии, вот статья, обсуждающая базу данных ключи.) В настоящее время модели Django поддерживают только один столбец в этом наборе, отрицая многие проекты, где естественным первичным ключом таблицы является несколько столбцов. В настоящее время Django не может работать с этими схемами; вместо этого они должны ввести избыточный ключ с одним столбцом ("суррогатный" ключ), заставляя приложения делать произвольные и в противном случае ненужные выборы о том, какой ключ использовать для таблицы в любом данном экземпляре. На этой странице описывается, как Django поддерживает эти составные первичные ключи. Там много деталей, чтобы получить прямо здесь, но сделано правильно, это позволит обеспечить большую гибкость и потенциальную простоту в моделировании данных.

Текущее Состояние

текущее состояние заключается в том, что проблема принята / назначена и обрабатывается, и есть частичная реализация на http://github.com/dcramer/django-compositepks - ... Реализация позволяет иметь составные первичные ключи. Однако в ForeignKey отсутствует поддержка составных ключей и RelatedManager. Как следствие, невозможно перемещаться по отношениям из моделей, имеющих составной первичный ключ.

обсуждений:

первоначальный патч Дэвида Кремера

композитный внешний ключ API design

авиабилет

Примечание - SqlAlchemy позволяет это, как описано ниже, и вы можете использовать SqlAlchemy для замены Django ОРМ!--5-->

внешние ключи также могут быть определены на уровне таблицы, используя ForeignKeyConstraint


Да, это возможно, но вам нужно будет создать составной ключ при использовании ограничения нескольких столбцов, т. е. внешнего ключа или первичного ключа. Например:

CREATE TABLE Student (
   S_num INTEGER,
   S_Cate INTEGER,
   S_descr CHAR(200),
   PRIMARY KEY (S_num, S_Cate))

CREATE TABLE sub_Student (
   Ssub_ID INTEGER PRIMARY KEY,
   Sref_num INTEGER,
   Sref_Cate INTEGER,
   sub_descr CHAR(500),
   FOREIGN KEY (Sref_num, Sref_Cate) REFERENCES Student
      (S_num, S_Cate))

В любом случае, вы можете создать "приспособление Django", как это:

CREATE INDEX product_category_id_id ON product (category_id, id);

для этого необходимо создать файл с именем product.sql в подпапке sql где находится ваша модель. Приспособление нагружено на начальном syncdb.