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