簡體   English   中英

為什么JsonResponse不自動序列化我的Django模型?

[英]Why doesn't JsonResponse automatically serialize my Django model?

我有以下模型:

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True


class User(AbstractUser):
    username = models.CharField(max_length=255, unique=True)
    email = models.EmailField(unique=True, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class Post(BaseModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content_url = models.URLField(null=False)

我希望能夠獲取數據庫中的所有模型。 當我這樣做時:

urlpatterns = [
    path("", views.get_all_posts, name="get_all_posts")]

def get_all_posts(request):
    return JsonResponse({"posts": Post.objects.all()})

我收到有關JSON序列化的錯誤。 因此,根據其他職位的建議,我這樣做:

def get_all_posts(request):
    posts = serializers.serialize('json', Post.objects.all())
    return JsonResponse({"posts": json.loads(posts)})

但是然后我得到了一個這樣形狀的物體:

('[{"model": "api.post", "pk": 1, "fields": {"created_at": '
 '"2019-05-06T20:22:43.928Z", "updated_at": "2019-05-06T20:22:43.928Z", '
 '"user": 1, "content_url": "tmp/posts/None.md"}}]')

你看到這多么荒謬嗎? 要獲得帖子的實際內容,我需要將每個“響應”映射到它的fields屬性,即使那樣,我仍然缺少主鍵!

我想知道為什么JSON響應接口不像這樣簡單:

def get_all_posts(request):
    return JsonResponse({"posts": Post.objects.all()})

看來,要向客戶端提供序列化的JSON,我必須跳過一系列的循環,說實話,這些循環在生產Web框架中不應該存在。

我究竟做錯了什么?

serialize()功能中使用format='python'為:

def get_all_posts(request):
    posts = serializers.serialize('python', Post.objects.all())
    return JsonResponse({"posts": posts})

使用queryset values() / values_list()方法進行序列化:

def get_all_posts(request):
    return JsonResponse({"posts": Post.objects.values_list()})

它還支持跨域字段,因此不會有嵌套的序列化,這很容易出錯:

def get_all_posts(request):
    return JsonResponse({
        "posts": Post.objects.values('content_url', 'user__username')
    })

但是對於某些復雜的fleid值,它也可能會失敗。 在這種情況下,可以在理解循環中將復雜的類型轉換為簡單的Python類型,或者使用第三方序列化程序(例如DRF或tastypie)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM