MongoDB с Django: TypeError: Экземпляры модели без значения первичного ключа являются нехешируемыми

Я пытаюсь подключить MongoDB к Django.

settings.py

DATABASES = {
        'default': {
            'ENGINE': 'djongo',
            'NAME': '<name>',
            'ENFORCE_SCHEMA': False,
            'CLIENT': {
                'host': f'mongodb+srv://{mongodb_username}:{mongodb_password}@{mongodb_cluster}/?retryWrites=true',
                'uuidRepresentation': 'standard',
                'waitQueueTimeoutMS': 30000
            }
        }
}

models.py

import uuid

from django.db import models


# Create your models here.
class ModernConnectUsers(models.Model):
    user_id = models.UUIDField(primary_key=True, default=uuid.uuid4())
    user_name = models.CharField(max_length=30, null=False)

Модель пока нигде не используется.

python manage.py makemigrations && python manage.py migrate

выходы:

Migrations for 'modern_connect':
  modern_connect/migrations/0003_alter_modernconnectusers_user_id.py
    - Alter field user_id on modernconnectusers
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, modern_connect, sessions
Running migrations:
  No migrations to apply.
  Your models in app(s): 'modern_connect' have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/base.py", line 414, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/base.py", line 460, in execute
    output = self.handle(*args, **options)
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/base.py", line 98, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 317, in handle
    emit_post_migrate_signal(
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/core/management/sql.py", line 52, in emit_post_migrate_signal
    models.signals.post_migrate.send(
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 176, in send
    return [
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 177, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/contrib/auth/management/__init__.py", line 83, in create_permissions
    ctypes.add(ctype)
  File "/home/sarvesh/PycharmProjects/modernConnect/venv/lib/python3.8/site-packages/django/db/models/base.py", line 597, in __hash__
    raise TypeError("Model instances without primary key value are unhashable")
TypeError: Model instances without primary key value are unhashable

Единственная коллекция, которую я сейчас использую, имеет первичный ключ, но по какой-то причине - программа падает для self.pk == None в Base.py, что вызывает эту ошибку. Решения в других вопросах не помогли, поэтому начинаю другой вопрос.

В вашем models.py попробуйте импортировать модели из djongo.

from djongo import models

А для первичного ключа я использую

class User(models.Model):
    _id = models.ObjectIdField()

Но вы можете поиграть с uuid() и посмотреть, работает это или нет.

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