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. В этом случае миграция выдаст ошибку. Существуют различные способы решения этой проблемы...., но это не входит в рамки данного ответа. Будьте здоровы

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