Django dumpdata/loaddata - Ключ не присутствует в таблице

Я пытаюсь сбросить данные postgres и загрузить их локально, но в итоге получаю ошибку

Вот две мои модели:

class User(AbstractUser):
    pass


class Profile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        primary_key=True
    )
    dob = models.DateField(null=True, blank=True)

Вот код, который я выполняю для дампа данных:

call_command('dumpdata', indent=4, exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'])

Однако, при попытке загрузить его, я получаю следующую ошибку:

django.db.utils.IntegrityError: Problem installing fixtures: insert or update on table "profiles_profile" violates foreign key constraint "profiles_profile_user_id_a3e81f91_fk_accounts_user_id"
DETAIL:  Key (user_id)=(1) is not present in table "accounts_user".

Что я заметил при попытке прочитать приспособление, так это то, что нет ни pks для пользователя, ни ссылок из профиля:

{
    "model": "accounts.user",
    "fields": {
        "password": "xyz",
        "last_login": "2022-11-27T17:28:45.854Z",
        "is_superuser": true,
        "username": "JohnDoe",
        "first_name": "John",
        "last_name": "Doe",
        "is_staff": true,
        "is_active": true,
        "date_joined": "2020-09-02T16:28:13.329Z",
        "groups": [],
        "user_permissions": []
    }
},

{
    "model": "profiles.profile",
    "pk": 1,
    "fields": {
        "dob": "1980-06-20",
    }
},

Это нормально? Обратите внимание, что я также пробовал использовать natural-foreign и natural-primary-keys следующим образом:

call_command('dumpdata', indent=4, exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'])

но без какого-либо эффекта.

Что я делаю не так?

Спасибо!

Попробуйте это...

from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
call_command('dumpdata', indent=4, exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'])

Похоже, что вы используете команду dumpdata в Django для сброса данных, но не указываете приложение(и) или модель(и), для которых вы хотите сбросить данные. В результате dumpdata сбрасывает все данные вашего приложения, включая модели contenttypes, auth.Permission, sessions и admin.logentry, которые вы затем исключаете с помощью опции exclude.

Чтобы исправить это, необходимо указать приложение(я) или модель(и), для которых вы хотите сбросить данные. Например, если вы хотите сбросить данные только для приложений Account и Profile, вы можете использовать следующую команду:

python manage.py dumpdata accounts profiles

Это приведет к дампу данных для моделей User и Profile из приложений accounts и profiles, соответственно. Затем вы можете использовать команду loaddata для загрузки этих данных в вашу локальную базу данных.

Также стоит отметить, что команды dumpdata и loaddata по умолчанию не включают первичные ключи. Это связано с тем, что первичные ключи обычно назначаются базой данных автоматически при создании новых записей, и их не нужно включать в дампы данных. Если вы хотите включить первичные ключи в свой дамп данных, вы можете использовать опцию --natural-primary-keys в команде dumpdata. Это включит первичные ключи ваших моделей в дамп данных, которые затем можно будет использовать с помощью loaddata для восстановления данных в вашей базе данных.

Например, вы можете использовать следующую команду для дампа данных с включенными первичными ключами:

python manage.py dumpdata --natural-primary-keys accounts profiles

Надеюсь, это поможет! Дайте мне знать, если у вас возникнут другие вопросы.

Похоже, проблема в том, что модель profiles.profile имеет внешний ключ к модели accounts.user, но когда данные выгружаются, объекты accounts.user не имеют первичных ключей. Это означает, что при загрузке данных нет возможности создать правильные отношения внешних ключей между объектами profiles.profile и accounts.user.

Одним из решений может быть добавление опций --natural-foreign и --natural-primary к команде dumpdata. Это включит первичные ключи связанных объектов в дамп данных, что позволит восстановить правильные отношения внешних ключей при загрузке данных.

Вот пример того, как вы можете использовать эти опции:

call_command('dumpdata', indent=4, exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'],
         natural_foreign=True, natural_primary=True)

Другим вариантом может быть использование опции --use-natural-keys, которая будет включать естественные ключи объектов в дамп данных вместо первичных ключей. Это может быть полезно, если в ваших моделях определены натуральные ключи, и вы хотите использовать их вместо первичных ключей при восстановлении данных.

Вот пример того, как вы можете использовать эту опцию:

call_command('dumpdata', indent=4, exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'],
         use_natural_keys=True)
Вернуться на верх