2016-11-02 5 views
0

データベースに既存のユーザーインスタンスがすでにあるとします。次に、私はちょうど私のアプリに新しいモデルを導入しました:すでにデータベースにあるDjangoのユーザーインスタンスを変更する

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 
    nickname = models.CharField(max_length=30, blank=True) 

すべてのユーザーにUserProfileインスタンスを作成します。私は、シグナルがUser()。save()のようなものでこれを処理できることを知っています。しかし、私のデータベースに既にユーザーは何をしていますか?

try: 
    user.profile.nickname = 'my_nickname' 
except: 
    profile = UserProfile() 
    profile.user = user 
    profile.nickname = 'my_nickname' 
    profile.save() 

しかし、これは、ビューが非常に長くなります:

は現在、私はviews.pyでそれを処理します。それを行うより良い方法はありますか?

+0

カスタムデータの移行を行い、プロファイルなしでユーザーを探す必要があります。 – Sayse

答えて

1

データベースにすでに存在するユーザーの場合は、djangoシェルでスクリプトを実行できます。その後

python manage.py shell 

>>from .models import * 
>>from django.contrib.auth.models import User 
>>users_without_profile = User.objects.filter(profile__isnull=True) 
>>for user in users_without_profile: 
....user.profile.nickname = 'your_choice_of_nickname' 
....user.save() 

ただ、サイドノート:*悪い習慣ですインポート、私はただ説明のため、とにかくそれをやったし、また、私はしませんでした.modelsからのような野生のインポートを実行しますあなたappnameを知っている。したがって、それぞれのアプリから適切なモデルをインポートします。

希望すると、これが役立ちます。

+0

ありがとうございました!シェルで書き留めなくてもこのコードを書く方法はありますか? 'python myfile.py'のようなもので、' python'と打ち込むのではなく、一行ずつコードを書く必要がありますか? 編集:ここで回答が見つかりました。明らかに、それは標準的な練習ではありません! http://stackoverflow.com/questions/16853649/executing-python-script-from-django-shell – irene

+0

シェルで実行するのはひどい考えです。適切な開発環境があれば、チームの誰もがこれを行うには、すべてのサーバーでそれを行う必要があります。 – Sayse

+0

@ Sayseカスタム移行について言及しましたが、どうすればそれについて知ることができますか?私はDjangoには比較的新しいので、 'python manage.py makemigrations'や' python manage.py migrate'以外の移行についてはあまり知らないです。ありがとう! – irene

関連する問題