2009-10-23 1 views
18

をPKフィールドを削除します。私は私のフィールドリストで「PK」を含めていないが、生産JSONは各シリアル化されたとの主キーが含まれて私は、オブジェクトの束をシリアライズしていジャンゴシリアライズされたオブジェクトから

json = serializers.serialize("json", objects, fields=('name', 'country')) 

オブジェクト。私は私のAPIが主キーを一般の人々に公開することを望まない。

出力JSONをmungingするのが短く、serializers.serialze()にプライマリキーを含めないように指示する正しい方法は何ですか?

+0

を@Joshライヒあなたはこの1つ上で何をして終わるのですか? @ http://code.djangoproject.com/ticket/4656 – orokusaki

+0

私は手作業でsimplejsonを呼び出すことになりました。 –

答えて

16

は、私が「手動」私は根本的simplejsonシリアライザを使用して欲しかったもの達成することによって、これを回避働くことになりました。

+0

jsonにいくつかのデータをダンプし、FKを気にしたくないのであれば良い解決策です。 –

+0

@Joshこれは、APIで5つのモデルを使用する28のメソッドがある場合、より多くのコーディングです。 – orokusaki

+0

私はこれを使用しました。しかし、いくつかのビューでこれを使用すると面倒です。 Djangoのシリアライザを使うのが一番です。最後の答えには、関連する質問へのリンクがあります。この質問には、生成されたオブジェクトからpkフィールドとmodelフィールドを削除する方法が説明されています。 – Dmitry

0

私たちは、PKを「浄化する」ために時間を無駄にしません。 JSONレコードを生成すると、PKがそこにあり、ユーザーは必要に応じて無視することができます。彼らは情報で何もすることができないので、ちょうど混乱です。

私たちのWebサービスインターフェイスでは、誰もが私たちにPKを提供することはできません。 POST、PUT、DELETE検索は他のフィールドで行いますが、PKでは行いません。

しかし、HTMLにはPKのURLが常に表示されます。人々はページをブックマークすることができます。

from django.utils import simplejson 
json = simplejson.dumps([{'name': o.name, 
          'country': o.country} for o in objects]) 

もう少しタイピングが、作品を:

+7

多くの企業は、逐次主キー内に情報が含まれていないと想定しています。アクセスコントロールをロックダウンしても、心配することはありません。 間違っています。少なくとも明らかなシーケンシャル識別子は、競合他社があなたの成長を追跡するための素晴らしい方法を提供します。逐次IDを見つけたり、成長予測を販売したりするだけで、大規模な業界が存在します。 –

+0

あなたは、順次IDの代わりにUUIDを使用することで問題に近づくかもしれません。そのため、公に公開すると競合他社の情報は提供されません。 –

+0

また、pk&modelが含まれている場合に各ユーザーに送信される余分なテキストも考慮してください。これは非常に明確に保存できる帯域幅です(特にこれをモバイルユーザーに送信する場合)。 – shaond

3

これは古い質問ですが、誰かがおそらくGoogle検索でそれを思い付くでしょう。

残念ながら、djangoシリアライザは、定義したようなカスタマイズはほとんどありません。私のソリューションは、あなたのプロジェクトにシリアライゼーションをたくさん使用することがわかっている場合は、単純にDjangoのシリアライゼーションを自分のプロジェクトにコピーして、少し変更を加えるだけでした。これは理想的ではありませんが、それは仕事です。 「PK」の行を削除

self.xml.startElement("object", { 
     "pk" : smart_unicode(obj._get_pk_val()), 
     "model" : smart_unicode(obj._meta), 
    }) 

はそれを修正する必要があります。具体的には、PK年代を削除するには、start_objectの行(自己、objが)があります。後でこれを改善するとビューにいくつかの変更が必要な場合があるので、これはやや汚れたハックですが、これは限界を回避する最も簡単な方法でした。

これは誰かを助けることを望みます。ここで説明したように

7

また、JSONシリアライザをオーバーライドすることがあります。Override Django Object Serializer to get rid of specified model

from django.core.serializers.json import Serializer, DjangoJSONEncoder 
from django.utils import simplejson 

import logging 

class MySerializer(Serializer): 
    def end_serialization(self): 
     cleaned_objects = [] 

     for obj in self.objects: 
      del obj['pk'] 
      cleaned_objects.append(obj) 

     simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options) 
+0

ありがとう!その質問の答えは多くの助けになりました! – Dmitry

0

醜い(しかし作業)方法:

data = json.loads(json_string) 

for d in data: 
    del d['pk'] 
    del d['model'] 

data = json.dumps(data) 

:ジョシュがしたが、後方何

data_tmp = data.split('{') 
#Gets all the data after fields 
response = "[{"+data_tmp[2].replace("}}","}",1) 
8

この方法では、フィールドを追加する際にコードの更新について心配する必要はありません 未来。

1

私は同じ問題を抱えていましたので、DjangoのSerializerから継承したSerializerを作成しました。 フィールドのデータのみを使用したいので、メソッドget_dump_objectを上書きし、PKフィールドを追加しました。

from django.core.serializers.json import Serializer 


class JSONSerializer(Serializer): 
    def get_dump_object(self, obj): 
     self._current[obj._meta.pk.name] = obj._get_pk_val() 
     return self._current 

およびコール:

output = JSONSerializer().serialize(queryset) 
関連する問題