7

そのため、プロジェクトの JSON オブジェクトを返そうとしています。Django が JSON を返すようにするには、数時間かかりました。

これまで取り組んできたビューは次のとおりです。

def json(request, first_name):
    user = User.objects.all()
    #user = User.objects.all().values()
    result = simplejson.dumps(user, default=json_util.default)
    return HttpResponse(result)

これが私のモデルです:

class User(Document):  
    gender = StringField( choices=['male', 'female', 'Unknown']) 
    age = IntField()
    email = EmailField()
    display_name = StringField(max_length=50)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
    location = StringField(max_length=50)
    status = StringField(max_length=50)
    hideStatus = BooleanField()
    photos = ListField(EmbeddedDocumentField('Photo')) 
    profile =ListField(EmbeddedDocumentField('ProfileItem'))
    allProfile = ListField(EmbeddedDocumentField('ProfileItem')) #only return for your own profile

これはそれが返すものです:

[<User: User object>, <User: User object>] is not JSON serializable

JSONを返す方法について何か考えはありますか?

4

3 に答える 3

11

MongoEngine 0.8 以降では、オブジェクトとクエリセットにto_json()メソッドがあります。

>>> User.objects.to_json()
于 2013-05-31T07:21:18.187 に答える
8

simplejson.dumps()カスタムオブジェクトに「到達」する方法がわかりません。default関数は、単にjson_util.default呼び出すstr()repr()、ドキュメント上にある必要があります。(json_utilあなたが書いたカスタムコードはありますか?もしそうなら、ここにそのソースを示すことは私の主張を証明するかもしれません。)

最終的に、default関数はMongoEngineドキュメントを理解できる必要があります。これを実装する方法は少なくとも2つ考えられます。

  1. default属性をイントロスペクトすることにより、すべてのMongoEngineドキュメントで機能するカスタム関数を記述し_fieldsます(ただし、先頭の下線は、これがMongoEngineのプライベートAPI /実装の詳細の一部であり、将来のバージョンで変更される可能性があることを意味します)

  2. 各ドキュメントas_dictに、オブジェクトのディクショナリ表現を返すメソッドを実装してもらいます。これはto_mongo、MongoEngineによってドキュメントで提供されるメソッドと同様に機能しますが、_typesまたは_clsフィールドを返さないようにする必要があります(ここでも、これらはMongoEngineの実装の詳細です)。

オプション#2を選択することをお勧めします。コードはよりクリーンで読みやすく、より適切にカプセル化され、プライベートAPIを使用する必要がなくなります。

于 2011-06-08T11:56:04.190 に答える
4

dcrosta が提案したように、このようなことを行うことができます。それが役に立てば幸いです。

文書定義

class MyDocument(Document):
    # Your document definition

    def to_dict(self):
        return mongo_to_dict_helper(self)

helper.py:

from mongoengine import StringField, ListField, IntField, FloatField

def mongo_to_dict_helper(obj):
    return_data = []
    for field_name in obj._fields:
        if field_name in ("id",):
            continue

        data = obj._data[field_name]

        if isinstance(obj._fields[field_name], StringField):
            return_data.append((field_name, str(data)))
        elif isinstance(obj._fields[field_name], FloatField):
            return_data.append((field_name, float(data)))
        elif isinstance(obj._fields[field_name], IntField):
            return_data.append((field_name, int(data)))
        elif isinstance(obj._fields[field_name], ListField):
            return_data.append((field_name, data))
        else:
            # You can define your logic for returning elements
    return dict(return_data)
于 2012-08-30T22:20:19.570 に答える