簡體   English   中英

如何在django / python中將JSON模型對象列表序列化為JSON

[英]How to serialize to JSON a list of model objects in django/python

我正在嘗試序列化定義為的模型對象列表:

class AnalysisInput(models.Model):
    input_user = models.CharField(max_length=45)
    input_title = models.CharField(max_length=45)
    input_date = models.DateTimeField()
    input_link = models.CharField(max_length=100)

我為json.dumps()編寫了一個自定義序列化器(編碼器):

class AnalysisInputEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, AnalysisInput):
            return { "input_id" : obj.id,
                    "input_user" : obj.input_user,
                    "input_title" : obj.input_title,
                    "input_date" : obj.input_date.isoformat(),
                    "input_link" : obj.input_link }
        return json.JSONEncoder.default(self, obj)

當我只序列化一個對象時,我能夠做到。 當我嘗試序列化我得到的對象列表時

[ objects..] is not JSON serializable

我搜索但我沒有找到工作的地方..我正在考慮為模型對象列表編寫自定義序列化器。

自定義編碼器不會遞歸調用。 實際上,最好使用自定義編碼器,而是在序列化之前將對象轉換為簡單的python類型。

您可以向模型添加as_json或類似命名的方法,並在每次需要JSON結果時調用它:

class AnalysisInput(models.Model):
    input_user = models.CharField(max_length=45)
    input_title = models.CharField(max_length=45)
    input_date = models.DateTimeField()
    input_link = models.CharField(max_length=100)

    def as_json(self):
        return dict(
            input_id=self.id, input_user=self.input_user,
            input_title=self.input_title, 
            input_date=self.input_date.isoformat(),
            input_link=self.input_link)

然后在你看來:

# one result
return HttpResponse(json.dumps(result.as_json()), content_type="application/json")

# a list of results
results = [ob.as_json() for ob in resultset]
return HttpResponse(json.dumps(results), content_type="application/json")

我發現序列化Django模型的最好方法是使用django.core.serializers將模型列表序列化為JSON,XML或YAML。 無需自定義序列化代碼! 文檔在這里: https//docs.djangoproject.com/en/dev/topics/serialization/

這是我的實現:

鉛/ models.py:

from django.db import models

class Lead(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=256)
    phone = models.CharField(max_length=20)
    twitter_handle = models.CharField(max_length=20)
    github_handle = models.CharField(max_length=20)

鉛/ views.py:

from django.http import HttpResponse
from django.core import serializers
from lead.models import Lead

def index(request):
    leads_as_json = serializers.serialize('json', Lead.objects.all())
    return HttpResponse(leads_as_json, content_type='json')

最終結果:

[{"pk": 1, "model": "lead.lead", "fields": {"twitter_handle": "johndoe", "name": "John Doe", "phone": "1(234)567-8910", "email": "john@doe.com", "github_handle": "johndoe"}}]

最簡單的解決方案

def index(request):
    data = serializers.serialize('json', Product.objects.all())
    return HttpResponse(data, content_type='application/json')

暫無
暫無

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

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