【问题标题】:error Object of type User is not JSON serializable用户类型的错误对象不是 JSON 可序列化的
【发布时间】:2021-06-07 08:29:42
【问题描述】:

嗨,我试图获取一个 json 响应以传递给模板,当我询问所有者属性时,问题就出现了,例如来自用户模型。除了message.owner,我收到了一切正常。我首先尝试使 User 可序列化对象,但它不起作用。 这是我的代码 聊天模型

'''

class ChatView(LoginRequiredMixin, View):
    model = Chat
    template_name = 'chats/all_chats.html'

    def get(self, request):
        return render(request, 'chats/all_chats.html')

    def post(self, request):
        chat = Chat(text=request.POST['message'], owner=request.user)
        chat.save()
        return redirect(reverse('all_chat'))

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)


class ChatMessagesView(LoginRequiredMixin, View):

    def get(self, request):
        User = get_user_model()

        messages = Chat.objects.all().order_by('created_at')[10:]
       
        
        results = []
        for message in messages:

            result = [message.text, message.owner, naturaltime(message.created_at)]
            results.append(result)

'''

【问题讨论】:

标签: json django serialization


【解决方案1】:

正如您所提到的,message.ownerUser 模型的一个实例。有很多方法可以序列化它。当您正在寻找构建 API 时,django-rest-framework 可能会派上用场,为您做很多工作。

一个简单的方法可能是实现一个函数,按照你的意愿序列化对象,给出一个编写自定义序列化器的简单示例:

app.user.serializers.user

def serialize(user):
    return {
        'id': user.id,
        'username': user.username,
        'email': user.email
    }

您可以添加某些序列化程序的嵌入,例如。当你有一个消息序列化器时

app.chat.serializers.chat

from app.user.serializers.user import serialize as serialize_user

def serialize(chat, embed=None):
    return {
        'id': chat.id,
        'message': chat.message,
        'created_at': naturaltime(message.created_at),
        'owner': serialize_user(user=chat.owner) if 'user' in embed else chat.owner.id
    }
from app.chat.serializers.chat import serialize as serialize_chat

def get(self, request):
    message = Chat.objects.all().order_by('created_at')[10:]
    
    results = []
    for message in messages:

        result = [serialize_chat(chat=message, embed=['user'])]
        results.append(result)

    # I've kept is as original as possible, but it could be simplified as:
    # return [serialize_chat(chat=message, embed=['user']) for message in messages]

这应该会导致类似

[
    {
        'id': 123,
        'message': 'my message',
        'owner': {
            'id': 456,
            'username': 'someone',
            'email': 'some@one.com',
        }
    },
    ...
]

但再次重申,这只是序列化对象的一个​​示例,还有更好的方法,但这可能会让你重新回到路上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-21
    • 2021-01-19
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2016-07-07
    • 2020-12-02
    相关资源
    最近更新 更多