2009-10-23 74 views
18

我一個序列化對象一堆用:刪除pk場

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

我沒有將「PK」在我的字段列表,但所產生的JSON包括與每一個序列化的主鍵目的。我不希望我的API向主要公衆公開主鍵。

傳輸輸出JSON的缺點是什麼,告知serializers.serialze()不包含主鍵的正確方法是什麼?

+0

@Josh帝國?有一張票據談到它@ http://code.djangoproject.com/ticket/4656 – orokusaki 2010-02-11 06:42:03

+0

我最終手動調用了simplejson – 2010-03-05 18:09:46

回答

16

我結束瞭解決此工作由「手動」實現自己夢想的使用基礎simplejson串行:

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

多一點打字,但作品。

+0

這是很好的解決方案,如果你只是想把一些數據轉儲到json而不關心FK的話。 – 2009-10-23 21:28:16

+0

@Josh如果您有28種方法在API中使用5個模型,那麼編碼就會更多。 – orokusaki 2010-02-11 06:18:35

+0

我用過這個。但是,在多個視圖中使用它時很麻煩。最好使用Django的序列化器。最後一個答案有一個相關問題的鏈接,它解釋瞭如何從它生成的對象中刪除pk和模型字段。 – Dmitry 2012-10-15 22:56:15

0

我們不會浪費時間試圖「消毒」PK的。當我們產生JSON記錄時,PK就在那裏,如果用戶願意,用戶可以忽略它。他們不能對信息做任何事情,所以它只是混亂。

我們的Web服務接口都不允許任何人向我們提供PK。我們在其他領域進行POST,PUT和DELETE搜索,但不是PK。

但是,HTML顯示PK的URL始終。它可以讓人們爲書籤添加書籤。

+7

許多公司都假設順序主鍵中沒有信息。如果你的訪問控制被鎖定了,沒有什麼可擔心的,對吧? 錯誤。至少,揭示連續的標識符爲競爭對手提供了一個很好的方式來跟蹤你的發展。有一個相當大的行業只是基於發現序列ID和銷售增長估計。 – 2009-10-23 21:00:52

+0

您可能會通過使用UUID而不是順序ID來解決您的問題,因此將其公開給公衆將不會爲競爭對手提供任何信息。 – 2009-10-23 21:27:32

+0

同時考慮包含pk&model時發送給每個用戶的額外文本。這是可以非常清楚地保存的帶寬(特別是發送給移動用戶時)。 – shaond 2012-01-04 20:44:14

3

雖然這是一個老問題,但其他人可能會在Google搜索中提出這個問題。

不幸的是,django序列化程序提供的定製相當少,就像您定義的那樣。我的解決方案,如果你知道你會爲你的項目使用很多序列化,只是簡單地將django的序列化的東西複製到我自己的項目中,並做一些小的改變。這並不理想,但是它完成了這項工作。具體來說,除去PK的,有在start_object行(個體經營,OBJ):

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

取出 「PK」 行應該修復它。這是一個有點骯髒的黑客,因爲如果他們後來改進這可能需要對您的意見進行一些更改,但對我而言,這是解決限制的最簡單方法。

希望這可以幫助別人。

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 2012-10-15 22:55:00

0

醜陋的(但工作)的方式:

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

約什做了什麼,但後退:

data = json.loads(json_string) 

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

data = json.dumps(data) 

這樣,您就不必擔心在添加更多字段時更新代碼未來。

1

我有同樣的問題,所以我創建了我自己的Serializer,繼承自Django的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) 
那你最終會做這一個