katsumasa0514
@katsumasa0514 (ASAP k)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

djangoでテストデータを挿入

Q&A

Closed

解決したいこと

WEBアプリを制作しています。
今回テストデータ(Faker)を挿入して動作を確認しようとしたのですがエラーが出てしまい、上手くいきません。

views.js
from django.contrib.auth.models import User
from faker import Faker

def add_user(request):
    fakegen = Faker('ja_JP')
    fake_name = fakegen.name()
    fake_email = fakegen.email()
    user, created = User.objects.create(username=fake_name, email=fake_email,)
    if created:
        user.set_password('nawa0514')
        user.save()
    return user

エラー

TypeError at /movieist/add_user
cannot unpack non-iterable User object   <-----エラー理由
Request Method: GET
Request URL:    http://localhost:8000/movieist/add_user
Django Version: 3.1.4
Exception Type: TypeError
Exception Value:    
cannot unpack non-iterable User object
Exception Location: /Users/nawakatsushou/Documents/コード/my_app_Movieist/container/django_app/movieist/views.py, line 255, in add_user
Python Executable:  /Users/nawakatsushou/.local/share/virtualenvs/my_app_Movieist-AKC486yy/bin/python
Python Version: 3.9.1
Python Path:    
['/Users/nawakatsushou/Documents/コード/my_app_Movieist/container/django_app',
 '/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
 '/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
 '/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
 '/Users/nawakatsushou/.local/share/virtualenvs/my_app_Movieist-AKC486yy/lib/python3.9/site-packages']
Server time:    Sun, 31 Jan 2021 19:19:09 +0900
Traceback Switch to copy-and-paste view
/Users/nawakatsushou/.local/share/virtualenvs/my_app_Movieist-AKC486yy/lib/python3.9/site-packages/django/core/handlers/exception.py, line 47, in inner
                response = get_response(request) …
▶ Local vars
/Users/nawakatsushou/.local/share/virtualenvs/my_app_Movieist-AKC486yy/lib/python3.9/site-packages/django/core/handlers/base.py, line 179, in _get_response
                response = wrapped_callback(request, *callback_args, **callback_kwargs) …
▶ Local vars
/Users/nawakatsushou/Documents/コード/my_app_Movieist/container/django_app/movieist/views.py, line 255, in add_user
    user, created = User.objects.create(username=fake_name, email=fake_email,) …
▶ Local vars

今回fakerを使いましたが、目的としてはサンプルデータを自分のデータベースに入れることです。別の方法等もご存知でしたらご教授いただけたらと思います。
至らない点が多々あるかと思いますがよろしくお願いします。

0

1Answer

エラーの原因は、createメゾッドのメソッドの戻り値を誤解されているからだと思います。
createメゾッドの返り値は、生成したオブジェクトのみで、createdは返ってきません。
失敗時は、例外が返ってきます。

# 誤
user, created = User.objects.create(username=fake_name, email=fake_email,)

# 正
user = User.objects.create(username=fake_name, email=fake_email)

また、UserManagerのcreate_userメソッドを使えば、パスワードの設定まで一度にできるので、もう少し簡単にできます。

# create_userを使う場合
user = User.objects.create_user(username=fake_name, email=fake_email, password='nawa0514')

もし、同じusernameのユーザが存在した場合は、新たに作成せずに、生成済みのモデルを返すことを意図しているのであれば、get_or_createメゾッドを使えば、期待通りの戻り値が返ってきます

user, created = User.objects.get_create(username=fake_name, email=fake_email)

0Like

Comments

  1. @katsumasa0514

    Questioner

    無事データを保存できました!
    ありがとうございました!

Your answer might help someone💌