Как установить 2 атрибута первичного ключа вместе в Django? - PullRequest
1 голос
/ 20 апреля 2020

У меня есть модель в Django:

 class Subject(models.Model):
    level = models.CharField(max_length=50)
    subject_name = models.CharField(max_length=50)
    teacher_name = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    total_seats = models.IntegerField()
    subject_details = models.CharField(max_length=50)

Для таблицы Subject я хочу, чтобы level и subject_name вместе были первичными ключами. На самом деле, я не хочу, чтобы другие объекты имели такое же имя и уровень. Я знаю, что могу использовать unique_together, но где я могу упомянуть primary_key = True?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы не . 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 на стороне данных.

1 голос
/ 20 апреля 2020

Я думаю, вы хотите, чтобы эти 2 поля были проиндексированы базой данных, потому что основная причина первичного ключа состоит в том, чтобы сделать поле уникальным и проиндексированным СУБД, чтобы вы могли сделать ваши поля unique_together в метаклассе и установить db_index=True в поле арг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...