Вы не . Django не работает с составными первичными ключами . Это указано в документации :
Для каждой модели требуется ровно одно поле, чтобы иметь primary_key=True
(либо явно объявленное, либо автоматически добавленное).
В разделе FAQ также продолжается:
Поддерживают ли модели Django первичные ключи с несколькими столбцами?
Нет . Поддерживаются только первичные ключи с одним столбцом.
Но на практике это не проблема, потому что ничто не мешает вам добавлять другие ограничения (используя опцию модели unique_together
или создавая ограничение непосредственно в вашей базе данных). ) и обеспечения уникальности на этом уровне. Первичные ключи с одним столбцом необходимы для работы таких объектов, как интерфейс администратора; например, вам нужно одно значение, чтобы указать объект для редактирования или удаления.
Эта функция часто запрашивается (см., например, этот Django тикет ), но это не было реализовано. Вероятно, это будет довольно громоздко, в первую очередь необходимо обновить существующий набор инструментов Django (например, JOIN
s следует выполнить с двумя ключами, FOREIGN KEY
s должно привести к двум или более полям построено, et c.). Но другой, и, возможно, еще более серьезной проблемой может быть большое количество пакетов, построенных поверх Django, которые предполагают, что первичный ключ не является составным. Таким образом, он может разбить множество пакетов в «экосистеме» Django.
Есть такие пакеты, как django-compositekey
[GitHub] , которые нацелены на реализацию это. Но последнее обновление сделано в октябре 2014 года.
Само по себе не проблема не сделать его первичным ключом. Фактически Django GenericForeignKey
[Django -doc] работает только в том случае, если все первичные ключи имеют одинаковый тип. Поэтому использования unique_together
должно быть достаточно. Обычно это также делает UNIQUE INDEX
на стороне данных.