Django или аналогичный для составных первичных ключей - PullRequest
14 голосов
/ 26 октября 2009

Я пишу веб-приложение для своей инжиниринговой компании (предупреждение: я программист только по хобби) и планировал использовать Django, пока не столкнулся с этой проблемой. Модели, которые я хочу использовать, имеют многоколонные первичные ключи. За http://code.djangoproject.com/ticket/373, Я не могу использовать Django, по крайней мере, не выпущенную версию. Может ли кто-нибудь помочь мне с обходным решением, будь то через другую веб-среду (только на основе Python) или предложив изменения в модели, чтобы она работала с ограничениями Django? Я действительно надеюсь на последнее, поскольку я надеялся использовать это как возможность выучить Джанго.

Пример: Таблица первая имеет part_number и part_revision как два поля, которые должны содержать первичный ключ. P / N может существовать в нескольких ревизиях, но P / N + rev уникальны.

Таблица два имеет part_number, part_revision и dimension_number в качестве своего первичного ключа. P / N на определенном обороте может иметь несколько измерений, однако каждое из них уникально. Кроме того, в этом случае P / N + rev должен быть ForeignKey таблицы 1.

Ответы [ 5 ]

23 голосов
/ 26 октября 2009

Почему бы не добавить нормальный первичный ключ, а затем указать, что part_number и part_revision как unique_together?

Это, по сути, Djangoish (Джангоник?) Способ делать то, что сказал Митч Уит.

19 голосов
/ 26 октября 2009

Обходной путь - создать суррогатный ключ (столбец автоинкремента) в качестве столбца первичного ключа и поместить уникальный индекс в составной ключ вашего домена.

Тогда внешние ключи будут ссылаться на столбец суррогатного первичного ключа.

14 голосов
/ 26 октября 2009

Я настоятельно рекомендую использовать суррогатный ключ. Не потому что это «Джангоск». Предположим, что вы используете составной ключ, который включает part_number. Что если через некоторое время ваша компания решит изменить формат (и, следовательно, значения) этого поля? Или в общих чертах любое поле? Вы не хотели бы иметь дело с изменением первичных ключей. Я не знаю, какую выгоду вы видите при использовании составного ключа, который состоит из «реальных» значений, но я считаю, что это не стоит хлопот. Используйте бессмысленные автоинкрементные ключи (и это, вероятно, сделает составной ключ бесполезным).

2 голосов
/ 26 октября 2009

SQLAlchemy имеет поддержку составных первичных и внешних ключей, поэтому любая основанная на SQLAlchemy инфраструктура (Pylons и Werkzeug приходит на ум) должна соответствовать вашим потребностям. Но суррогатный первичный ключ проще в использовании и лучше поддерживается в любом случае.

0 голосов
/ 25 ноября 2016

, если вы хотите только уникальные смешанные поля:

class MyTable(models.Model):
    class Meta:
        unique_together = (('key1', 'key2'),)

    key1 = models.IntegerField()
    key2 = models.IntegerField()

Но если вы хотите, чтобы уникальный вместе и один из столбцов был первичным, попробуйте аналогичный ниже код:

class MyTable(models.Model):
    class Meta:
        unique_together = (('key1', 'key2'),)

    key1 = models.IntegerField(primary_key=True)
    key2 = models.IntegerField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...