Django: Как автоматически заполнить предыдущих пользователей в поле user новой модели, использующей отношение OneToOne
У меня есть обычный проект, который хранит пользователей в таблице auth_user django.
Позже я решил реализовать profiles
приложение. Код views.py
приведен ниже
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
я делаю makemigrations
и migrate
. Таблица создается с пустыми данными, т.е. предыдущие пользователи, существующие в auth_user
, не были заполнены в таблице profiles_profile
.
Как я могу заполнить старые данные в новой таблице?
Спасибо
Получите все объекты из пользовательских моделей и сохраните их в модели профиля с помощью оболочки. Это самый простой способ.
python manage.shell
тогда импортируйте обе модели User и Profile
for user in User.objects.all():
profile=Profile()
profile.user=user
profile.save()
Вот как это сделать: в терминале введите:
python manage.py makemigrations --empty profiles
Я использую profiles, потому что это имя моего приложения.
Это создает файл в папке migrations вашего приложения.
Например, мой
0005_auto_20221101_1518.py
В этот файл введите следующее:
from django.db import migrations
from django.conf import settings
def make_profiles(apps, schema_editor):
User = apps.get_model(settings.AUTH_USER_MODEL)
Profile = apps.get_model('profiles', 'Profile')
profiles = [Profile(user=user) for user in User.objects.filter(profile=None)]
Profile.objects.bulk_create(profiles)
class Migration(migrations.Migration):
dependencies = [
('profiles', '0004_merge_20221101_1507'),
]
operations = [
migrations.RunPython(make_profiles),
]
ok здесь вы легко разберетесь. В моем случае Profile - это модель, а profiles - имя_приложения. 0004_merge_20221101_1507
соответствует предыдущему файлу миграции. Он устанавливается автоматически, так что беспокоиться не о чем, однако если вы играете с файлами миграции, то этот файл должен быть предыдущим в списке... обычно он обозначается по порядку 0001..., 0002, ...0003, 0004 и т.д.
После этого просто makemigrations
и migrate
. И это все... однако, что если у вас есть уникальное поле в вашей новой таблице, например, slug, основанный на имени_и фамилии пользователя. У вас может возникнуть проблема, поскольку два пользователя могут использовать одно и то же поле slug. В этом случае миграция выдаст ошибку.
Существуют различные способы решения этой проблемы...., но это не входит в рамки данного ответа. Будьте здоровы