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)