Измените _id с ObjectId на обычное уникальное целое число с автоматическим инкрементом

Я довольно новичок в Django и веб-разработке, поэтому все это для меня ново, так как я учусь.

Недавно я установил Django-сайт и работал с Postgresql. Когда я его создавал, я перемудрил и мне понадобилось использовать Postgresql специально из-за одного из полей, которых не было у SQLite. В любом случае, я собираюсь переделать его (v2) и хочу преобразовать в MongoDB. Сейчас у меня все настроено, но я заметил, что когда я создаю новые элементы из моих моделей в панели администратора, в базе данных появляется _id:ObjectId("61ba69238db76b91b4bf42f1"). Я предполагаю, что это первичный ключ? Однако Django, насколько я понимаю, ищет обычное целочисленное значение. Поэтому, когда я пытаюсь что-то удалить или изменить, он выдает ошибку: Field 'id' expected a number but got 'None'.

Должен ли я создавать собственное поле "id" для каждой модели? Следует ли/можно ли использовать поле по умолчанию _id?

Спасибо!

В MongoDB каждый документ, хранящийся в коллекции, требует уникального поля _id поле, которое действует как первичный ключ.

Поле _id docs.

Поле "_id" всегда находится в коллекции mongo. Если вы не предоставите поле "_id" в вашей модели явным образом, например, так:

_id = djongo_models.ObjectIdField()

то вы не сможете запросить его у djongo. Если же вы не предоставите ни одного поля, отмеченного как primary_key, то djongo поможет вам и предоставит

id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')

Вы можете проверить это в файлах миграции. Djongo также создает уникальный индекс для этого поля. Таким образом, в итоге у вас будет два уникальных индекса, один - "_id", который является bson ObjectId, а второй - "id", который будет последовательным целым числом. И если у вас есть автополе "id", добавленное вами или djongo за кулисами, вы должны быть в состоянии фильтровать по "id", как:

YourModel.objects.filter(id=1).delete()

Таким образом, вам не нужно добавлять поле "id", djongo сделает это за вас. А поле "_id" всегда будет в коллекции mongo, вы можете игнорировать его или добавить в вашу модель и использовать его (запрос).

Вернуться на верх