0

Ajaxリクエストへの応答としてDjangoモデルを配置したいと思います。現在、views.pyにこれがあります:

def get_account(request, account_id):

    try:
        account = Account.objects.get(pk=account_id)
        success = True
        error_message = None
    except Account.DoesNotExist:
        success = False
        error_message = 'This account does not exist'

    results = {
        'success': success,
        'error_message': error_message,
    }

    return HttpResponse(
        json.dumps(results),
        mimetype='application/json')

accountモデルをresultsdictに追加したいと思います。account.__dict__他のオブジェクトへの参照が含まれているため、実行されません。

de django serialize関数を見つけました。これは、希望どおりにシリアル化しますが、Json文字列を直接作成するだけなので、Jsonオブジェクト内にJson文字列が含まれることになります(モデルが大きい場合は、bandwithに適していません。 Json文字列はすべてエスケープされます)。したがって、Javascriptでもう一度json_decodeする必要があります。

また、djangoのシリアル化関数はオブジェクトのリストのみを受け入れるため、1つのオブジェクトのみでリストを作成する必要があり、シリアル化を解除すると、リストの最初の値が取得されます(これはそれほど大きな問題ではありませんが、追加されます)山まで)。

モデルをPythondictだけにシリアル化できれば素晴らしいと思います。その後、好きなようにそれを使って何でもすることができます。

誰もが同じ問題を抱えたことはありますか?どのようにそれを解決しましたか?

4

3 に答える 3

2

Python dictにシリアル化し、それを渡してJSONに変換できます。

qs_as_dict = serializers.serialize('python', qs)
results['objects'] = qs_as_dict
于 2012-12-23T23:31:52.103 に答える
1

モデルオブジェクトを返す代わりに、応答に必要な目的の値を返すだけではどうでしょうか。

results.update({'account': {'id': account.id, 'title': account.title}})
于 2012-12-23T22:51:12.053 に答える
0

ダニエルの答えの助けを借りて、私はそれを行うことができました:

def get_account_data(account):
    fields = serializers.serialize('python', [account, ])[0]['fields']
    return {field: str(fields[field]) for field in fields}

Ajaxで送信しているので、すべてを文字列にする必要がありました。'python'メソッドを使用してシリアル化する場合、日時フィールドなどの一部には関数が含まれます(などdatetime.date(2012, 12, 23))。この関数は、文字列値のみを使用してdictを作成します。

于 2012-12-24T00:41:38.183 に答える