首页 > 解决方案 > Django模型,如何添加用户而不是实例?

问题描述

我正在尝试返回 JSON 格式,但出现错误 User object is not JSON serializable

我进行了调试并发现了问题,但我坚持修复它。

现在,如果我打印我的对象,我会得到这样的格式

[
    {
    'id': 1,
    'poster': <User: stackoverflow>,
    'description': 'test',
    'date_added': 'Apr 20 2021, 02:52 AM',
    'likes': 1
    }
]

如何将“海报”作为仅包含用户名的字符串返回?

模型.py

from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):
    pass


class NewPost(models.Model):
    poster = models.ForeignKey("User", on_delete=models.PROTECT, related_name="posts_posted")
    description = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)
    likes = models.IntegerField(default=1)

    def serialize(self):
        return {
            "id": self.id,
            "poster": self.poster,
            "description": self.description,
            "date_added": self.date_added.strftime("%b %d %Y, %I:%M %p"),
            "likes": self.likes
        }

views.py - 生成新对象的函数

@csrf_exempt
def compose_post(request):
    # Composing a new post must be via POST
    if request.method != "POST":
        return JsonResponse({"error": "POST request required."}, status=400)

    # Check post words
    data = json.loads(request.body)
    words = [word.strip() for word in data.get("description").split(" ")]
    if words == [""]:
        return JsonResponse({
            "error": "At least one word required."
        }, status=400)

    # Convert post to NewPost object
    description = data.get("description", "")

    new_post = NewPost(poster=request.user, description=description)
    new_post.save()
    return JsonResponse({"message": "Post saved successfully."}, status=201)

标签: pythondjango

解决方案


由于您的函数返回一个字典,您可以使用:

NewPost.serialize()['poster']

或者可能:

NewPost.objects.get(id = id)['poster']

推荐阅读