Python: Попытка создать объект json с помощью dict (TypeError: невозможно распаковать не повторяемый объект User) - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь сделать полный JSON объект возврата из модуля, который получает всех пользователей из базы данных и вводит их данные в один JSON объект, но я получаю TypeError: cannot unpack non-iterable User object, я действительно не знаю в чем проблема.

from application.models import User


class users_eng:

    def __init__(self):
        pass

    def get_users(self):
        users = User.query.all()

        # users output - [<User 9nematix>, <User 3nematix>, <User 6nematix>]

        for user in users:
            users_data = {
                dict(
                    username=user.username,
                    bio=user.profile_bio,
                    role=user.role,
                    profile_picture=user.profile_picture
                ) for user.username, user.profile_bio, user.role, user.profile_picture, *_ in users
            }

        x = json.dumps(users_data)
        print(x)

        return x

_users_ = users_eng()

** РЕДАКТИРОВАТЬ: я обновил свой код с другим решением в комментариях, но теперь я получаю [<generator object users_eng.get_users.<locals>.<genexpr> at 0x000001AF38C828C8>]

from application.models import User
from flask import session
import json


class users_eng:

    def __init__(self):
        pass

    def get_users(self):
        users = [
            User.query.all()
        ]

        # users output - [<User 9nematix>, <User 3nematix>, <User 6nematix>]
        users_data = []
        for user in users:
            users_data.append(
                dict(
                    username=user.username,
                    bio=user.profile_bio,
                    role=user.role,
                    profile_picture=user.profile_picture,
                ) for user in users
            )

        print(users_data)

        return users_data

_users_ = users_eng()

1 Ответ

1 голос
/ 17 апреля 2020

Ваш пользовательский объект не является повторяемым типом. Как правило, базы данных моделей нет. Вам нужно изменить for user.username user.bio ... на for user

Кроме того, диктовки не подлежат изменению, поэтому после исправления первой ошибки вы столкнетесь с другой ошибкой. Я бы порекомендовал сделать ваш users_data массивом диктов вместо dict

Пример:

# Ignore this, substitute with your own model
from database.models import User

users = [
    User(email="foo@bar.com", first="Foo", last="Bar")
]

users_data = [
    dict(
        email=user.email,
        name=f"{user.first} {user.last}",
    ) for user in users
]

Дополнительный пример преобразования этого обратно в действительный JSON объект

from json import dumps

from database.models import User

users = [
    User(email="foo@bar.com", first="Foo", last="Bar")
]

users_data = [
    dict(
        email=user.email,
        name=f"{user.first} {user.last}",
    ) for user in users
]

# This is valid JSON
rv = dumps({"users": users_data})
print(rv)

Вывод:

{"users": [{"email": "foo@bar.com", "name": "Foo Bar"}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...