Django или аналогичный для составных первичных ключей

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

Это, по сути, Djangoish (Djangonic?) способ сделать то, что сказал Митч Пит.

Ответ 3

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

Ответ 4

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

Ответ 5

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

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()